题意:
给一个n点的树,每条边都有边权,问从根出发需要增加多少长度,使得最终的儿子到根的距离是一样的
思路:
上来一个思路wa了3次,看完题解之后,又一次豁然开朗……
orz
#include<bits/stdc++.h> using namespace std; #define ll long long #define il inline #define it register int #define inf 0x3f3f3f3f #define lowbit(x) (x)&(-x) #define mem(a,b) memset(a,b,sizeof(a)) #define mod 1000000007 const int maxn=5e5+10; struct node{ int to,next,w; }a[maxn<<1]; int n,s,cnt,tot,head[maxn],maxx[maxn]; ll ans; il void add(int u,int v,ll w){ a[tot].w=w;a[tot].next=head[u]; a[tot].to=v;head[u]=tot++; } void dfs(int u,int qian){ for(it i=head[u];i!=-1;i=a[i].next){ int v=a[i].to,w=a[i].w; if(v==qian){continue;} dfs(v,u); maxx[u]=max(maxx[u],maxx[v]+w); } for(it i=head[u];i!=-1;i=a[i].next){ int v=a[i].to,w=a[i].w; if(v==qian){continue;} ans+=(ll)(maxx[u]-w-maxx[v]); } } int main(){ scanf("%d%d",&n,&s); tot=0;mem(head,-1);ans=0; for(it i=1;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w);add(v,u,w); } dfs(s,0); printf("%lld ",ans); return 0; }