Skip to content

Commit b7f0d7e

Browse files
authored
graph, tdp
1 parent fb08a24 commit b7f0d7e

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

TopCoder/TreeAndCycle_tdp.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//category : graph, tdp
2+
#include <vector>
3+
#include <algorithm>
4+
#include <stdio.h>
5+
using namespace std;
6+
7+
class TreeAndCycle{
8+
public:
9+
int n;
10+
int d[100][3]; //degree
11+
int cut[100];
12+
vector<int> *costV;
13+
14+
vector<int> edge[100];
15+
void dfs(int ix){
16+
int i, j, k;
17+
int t[3];
18+
d[ix][0] = 0;
19+
for (i = 0; i < edge[ix].size(); i++){
20+
int to = edge[ix][i];
21+
dfs(to);
22+
t[0] = t[1] = t[2] = 1e9;
23+
for (j = 0; j < 3; j++){
24+
for (k = 0; k < 3; k++){
25+
t[j] = min(t[j], d[ix][j] + d[to][k] + cut[to]);
26+
if (j > 1 || k > 1) continue;
27+
t[j + 1] = min(t[j + 1], d[ix][j] + d[to][k] - costV->at(to));
28+
}
29+
}
30+
for (j = 0; j < 3; j++) d[ix][j] = t[j];
31+
}
32+
d[ix][0] += costV->at(ix);
33+
d[ix][0] += costV->at(ix);
34+
if (edge[ix].size())
35+
d[ix][1] += costV->at(ix);
36+
//printf("%d:%d,%d,%d\n", ix, d[ix][0], d[ix][1], d[ix][2]);
37+
}
38+
39+
40+
int minimize(vector<int> costV, vector<int> pre, vector<int> costE){
41+
int i;
42+
n = costV.size();
43+
this->costV = &costV;
44+
for (i = 0; i < n - 1; i++){
45+
edge[pre[i]].push_back(i + 1);
46+
cut[i + 1] = costE[i];
47+
d[i][0] = d[i][1]= d[i][2]= 1e9;
48+
}
49+
d[i][0] = d[i][1] = d[i][2] = 1e9;
50+
dfs(0);
51+
52+
return min(d[0][1], min(d[0][0],d[0][2]));
53+
}
54+
};

0 commit comments

Comments
 (0)