时态同步
树形dp
细节:
- 一定要双向加边,是无向图。
- 既然是无向图,维护时不要把到父节点的边计算了。
- 维护的顺序一定不能乱。
- 答案要用long long 存。
#include <bits/stdc++.h> #define MAXN 1000005 using namespace std; struct Edge{int next,to,dis;} edge[MAXN]; int n,s,a,b,t,maxn[MAXN],cnt,head[MAXN]; long long ans; void addedge(int from, int to, int dis) { edge[++cnt].next=head[from]; edge[cnt].to=to; edge[cnt].dis=dis; head[from]=cnt; } void dfs(int x, int fa) { for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) dfs(edge[i].to, x); for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) maxn[x]=max(maxn[x], edge[i].dis); for(int i=head[x]; i; i=edge[i].next) if(edge[i].to!=fa) ans+=(maxn[x]-edge[i].dis); for(int i=head[fa]; i; i=edge[i].next) if(edge[i].to==x) edge[i].dis+=maxn[x]; } int main() { scanf("%d%d",&n,&s); for(int i=1; i<=n-1; i++) { scanf("%d%d%d",&a,&b,&t); addedge(a, b, t); addedge(b, a, t); } dfs(s, 0); printf("%lld\n",ans); return 0; }