洛谷1131 時態同步(DFS)
阿新 • • 發佈:2018-11-11
傳送門
【題目分析】
為什麼我搜樹形DP會冒出來這個東東。。。。。。。
對於一個點,他的兒子們一定會更新成子樹內最大的那一條路徑的值,dfs更新一下即可。
PS:為什麼全域性long long他就有3個點過不了??
【程式碼~】
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN=1e6+10; const int MAXM=2e6+10; int n,rt,cnt; LL ans; int head[MAXN]; int dis[MAXN]; int nxt[MAXM],to[MAXM],w[MAXM]; int Read(){ int i=0,f=1; char c; for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0'; return i*f; } void add(int x,int y,int z){ nxt[cnt]=head[x]; head[x]=cnt; to[cnt]=y; w[cnt]=z; cnt++; } void dfs(int u,int f){ for(int i=head[u];i!=-1;i=nxt[i]){ int v=to[i]; if(v==f) continue; dfs(v,u); dis[u]=max(dis[u],dis[v]+w[i]); } for(int i=head[u];i!=-1;i=nxt[i]){ int v=to[i]; if(v==f) continue; ans+=dis[u]-dis[v]-w[i]; } } int main(){ memset(head,-1,sizeof(head)); n=Read(),rt=Read(); for(int i=1;i<n;++i){ int x=Read(),y=Read(),z=Read(); add(x,y,z),add(y,x,z); } dfs(rt,-1); cout<<ans; return 0; }