核心思想如下:

将一颗树按照与根节点的距离进行分层,同个图形的是一种分层,总共就只有两种分层,最后看看哪个更小就行,因为是树,就不用考虑环等情况,自造样例可过,数据样例可过,实测10pt
in:
10
1 10 3 2 3 4
2 11 1 5
3 3 1 6
4 9 1 7
5 5 1 8
6 2 2 9 10
7 8 0
8 7 0
9 6 0
10 1 0
out:
25
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 10;
struct Edge {
int nxt, to;
} e[maxn << 1];
int a[maxn], head[maxn];
int n, sum1, sum2, len = 0, flag = 0;
void add(int u, int v) {
e[++len].nxt = head[u];
e[len].to = v;
head[u] = len;
}
void dfs(int u, int flag) {
if (flag == 0) {
sum1 += a[u];
} else {
sum2 += a[u];
}
flag = (flag + 1) % 2;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
dfs(v, flag);
}
return;
}
int main() {
scanf("%d", &n);
for (int i = 1, u, m; i <= n; ++i) {
scanf("%d%d%d", &u, &a[i], &m);
if (m == 0) {
continue;
}
for (int j = 1, v; j <= m; ++j) {
scanf("%d", &v);
add(u, v);
}
}
dfs(1, 0);
printf("%d", min(sum1, sum2));
return 0;
}