题意:
给一个n点的树,每条边都有边权,问从根出发需要增加多少长度,使得最终的儿子到根的距离是一样的
思路:
上来一个思路wa了3次,看完题解之后,又一次豁然开朗……
orz
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define il inline 5 #define it register int 6 #define inf 0x3f3f3f3f 7 #define lowbit(x) (x)&(-x) 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 #define mod 1000000007 10 const int maxn=5e5+10; 11 struct node{ 12 int to,next,w; 13 }a[maxn<<1]; 14 int n,s,cnt,tot,head[maxn],maxx[maxn]; 15 ll ans; 16 il void add(int u,int v,ll w){ 17 a[tot].w=w;a[tot].next=head[u]; 18 a[tot].to=v;head[u]=tot++; 19 } 20 void dfs(int u,int qian){ 21 for(it i=head[u];i!=-1;i=a[i].next){ 22 int v=a[i].to,w=a[i].w; 23 if(v==qian){continue;} 24 dfs(v,u); 25 maxx[u]=max(maxx[u],maxx[v]+w); 26 } 27 for(it i=head[u];i!=-1;i=a[i].next){ 28 int v=a[i].to,w=a[i].w; 29 if(v==qian){continue;} 30 ans+=(ll)(maxx[u]-w-maxx[v]); 31 } 32 } 33 int main(){ 34 scanf("%d%d",&n,&s); 35 tot=0;mem(head,-1);ans=0; 36 for(it i=1;i<n;i++){ 37 int u,v,w; 38 scanf("%d%d%d",&u,&v,&w); 39 add(u,v,w);add(v,u,w); 40 } 41 dfs(s,0); 42 printf("%lld\n",ans); 43 return 0; 44 }