代码:
#include <bits/stdc++.h>
using namespace std;
int n, w[1005], l[1005], r[1005];
long long minn = 1e18;
int xx[1005][1005];
bool flag[1005];
vector<int> a[1005];
void dfs(int x, int start, int step)
{
flag[x] = true;
xx[x][start] = step;
xx[start][x] = step;
for (int i = 0; i < a[x].size(); i++)
{
if (flag[a[x][i]] == false)
{
dfs(a[x][i], start, step + 1);
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> w[i] >> l[i] >> r[i];
a[i].push_back(l[i]);
a[l[i]].push_back(i);
a[i].push_back(r[i]);
a[r[i]].push_back(i);
}
for (int i = 1; i <= n; i++)
{
memset(flag, 0, sizeof(flag));
dfs(i, i, 0);
}
for (int i = 1; i <= n; i++)
{
long long sum = 0;
for (int j = 1; j <= n; j++)
sum += xx[i][j] * w[j];
//cout << "sum" << i << ":" << sum << endl;
minn = min(minn, sum);
}
// for (int i = 1; i <= n; i++)
// {
// printf("xx[%d] = {", i);
// for (int j = 1; j <= n; j++)
// {
// printf("%d", xx[i][j]);
// if (j != n) cout << ", ";
// }
// cout << "}" << endl;
// }
cout << minn << endl;
return 0;
}
测试数据:
50
1 2 3
4 0 0
87 4 5
21 0 0
28 6 7
68 0 0
32 8 9
17 0 0
38 10 11
43 0 0
9 12 13
48 0 0
8 14 15
85 0 0
6 16 17
30 0 0
92 18 19
37 0 0
78 20 21
33 0 0
70 22 23
85 0 0
72 24 25
31 0 0
17 26 27
33 0 0
47 28 29
25 0 0
83 30 31
28 0 0
49 32 33
15 0 0
88 34 35
29 0 0
78 36 37
98 0 0
50 38 39
89 0 0
83 40 41
3 0 0
15 42 43
15 0 0
51 44 45
3 0 0
60 46 47
1 0 0
78 48 49
66 0 0
78 50 0
71 0 0
自己的输出:
18105
注释掉了调试的代码,可以自己打开