@[Sakura_Tears](/user/549563)
额,啥意思
by 幽灵特工 @ 2021-09-17 15:12:35
哦,这里建议让别人调代码前粘贴一份能过编的代码..
by AcetylChloride @ 2021-09-17 15:13:52
不是,你又不知道谁是谁儿子怎么敢建单向边的。。
by AcetylChloride @ 2021-09-17 15:16:14
@[Sakura_Tears](/user/549563) 哦我重发一份
by 幽灵特工 @ 2021-09-17 15:17:28
@[Sakura_Tears](/user/549563) 题目里给的就是一个点的儿子数组
by 幽灵特工 @ 2021-09-17 15:18:02
不用重发了。。
by AcetylChloride @ 2021-09-17 15:18:14
你需要给边的两个端点定序,比如强制小的连向大的,这个图才是正确的
by AcetylChloride @ 2021-09-17 15:19:00
@[Sakura_Tears](/user/549563)
之前这个sol里传两个参,还有一个是fa,我想想没必要就把参数列表里的fa删掉了,但是调用的地方没删嘻嘻
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, v[1510];
vector <int> G[1510];
int dp[1510][5];//0=self,1=fa,2=son
void sol(int x) {
int sum = 0;
dp[x][0] = v[x]; dp[x][2] = 1e9;
for (int i = 0; i < G[x].size(); i++) {
int y = G[x][i];
sol(y);
sum += min(dp[y][0], dp[y][2]);
dp[x][0] += min(dp[y][0], min(dp[y][1], dp[y][2]));
}
dp[x][1] = sum;
for (int i = 0; i < G[x].size(); i++) {
int y = G[x][i];
dp[x][2] = min(dp[x][2], sum - min(dp[y][2], dp[y][0]) + dp[y][0]);
}
}
int main() {
ios::sync_with_stdio(0);
cin >> n;
int x, k, m;
for (int i = 0; i < n; i++) {
cin >> x >> k >> m;
v[x] = k;
for (int j = 0; j < m; j++) {
cin >> k; G[x].push_back(k);
}
}
sol(1);
cout << min(dp[1][0], dp[1][2]);
}
```
by 幽灵特工 @ 2021-09-17 15:20:49
额,题目输入就是一棵树
by 幽灵特工 @ 2021-09-17 15:22:07
你是不是没听懂我在讲什么。比如 son[2][p]=1,然后你钦定了1为根,这个图不是错的?
by AcetylChloride @ 2021-09-17 15:23:37