树形DP——CF 767C Garland
树形DP——CF 767C Garland
这道题是通过dfs来对树进行搜索,同时在回溯的过程中来记录每个点的子树的总温度大小(所有子树的温度总和+这个子树的根节点的温度)。通过子树来更新当前子树的动态规划。
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; const int MAXN = 1e6+10; struct Edge{ int u, v, next; }edge[MAXN<<1]; int head[MAXN]; int tem[MAXN]; int vis[MAXN]; int size[MAXN]; int cnt; int sum; int root; vector<int> ans; void addEdge(int u, int v){ edge[cnt].u = u; edge[cnt].v = v; edge[cnt].next = head[u]; head[u] = cnt++; return; } void ini(int n) { for(int i = 1; i <= n; i++) head[i] = -1; cnt = 0; return; } int dfs(int u) { for(int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].v; tem[u] += dfs(v); } if(tem[u] == sum && u != root) { ans.push_back(u); return 0; } return tem[u]; } int main() { int n; scanf("%d", &n); ini(n); for(int i = 1; i <= n; i++) { int v, temp; scanf("%d %d", &v, &temp); addEdge(v, i); tem[i] = temp; if(v == 0) root = i; sum += temp; } if(sum%3) { printf("-1\n"); return 0; } sum /= 3; dfs(root); if(ans.size() == 2) { sort(ans.begin(), ans.end()); for(int i = 0; i < ans.size(); i++) { cout << ans[i] << ' ' ; } } else cout << "-1" << endl; return 0; }

浙公网安备 33010602011771号