树形DP求助

P2458 [SDOI2006] 保安站岗

@[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


| 下一页