洛谷P1131 时态同步

题意:

给一个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 }
View Code

猜你喜欢

转载自www.cnblogs.com/luoyugongxi/p/12274800.html