众所周知,moreD的宠物已经被moreD奴役得体无完肤。这只宠物实在忍无可忍,把本身天天走魔法树的经历告诉了
本身的宠物。同时他还说明了本身爬树是多么地慢,以致于moreD天天都残酷地训练他爬树。幸运的是moreD的宠物
的宠物不是moreD的宠物,moreD的宠物深知"宠物是用来宠的而不是用来奴役的"这一点,因此moreD的宠物对待自
己的宠物颇有爱。因此moreD的宠物与其宠物商量着要推翻moreD的暴政,方法是把moreD告上法庭,就以本身天天
被迫爬树来作证据。因为魔法树是树,训练树固然也是树啦。moreD的训练有着GX的文化,天天moreD会把本身的宠
物通灵到树的一个端点上,这个通灵点可能与以前的通灵点相同。而后moreD命令他的宠物从这个点开始走,让这
只宠物随便访问本身该天以前没有访问过的节点,一直走到该天无路可走,训练才会结束,宠物才能够休息。more
D的宠物天天都会在这棵树上训练,幸运的是他天天走过的训练路径都不一样,直到若干天后,全部可能的训练路径
都被走遍了。你,做为moreD宠物的宠物,一只被moreD的宠物宠着的宠物,固然想帮moreD的宠物算出他总共走过
的路径长度啦。c++
第一行包含两个正整数N,M,表示树的点数与边数。接下来M行,每行三个正整数表示
Li,bi,ci分别表示树上有一条长度为Li的链接bi,ci两个结点的边。全部输入的整数均不大于100,000,输入的树保
证连通,无重边,无自环。git
仅一行表示答案。spa
本题让咱们求树上每个点到全部叶子节点的长度总和,那么咱们能够考虑每一条边对答案的贡献code
一条边能够把树分红两个部分,而这条边被通过的次数则能够根据两部分的size和叶子节点个数得出ip
咱们设sz[x]表明以x为根的子树的大小,num[x]表明以x为根节点的子树的叶子节点的个数ci
则一条边的贡献可表示为:\(val*(sz[rt]-sz[v])*num[v]+val*(num[rt]-num[v])*sz[v]\)get
最后对每一条边都统计答案就好了。input
注意本题输入形式!!!it
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+1; long long ans; int rt,n,m,cnt,head[N],num[N],sz[N]; struct Edge{int nxt,to,val;}edge[N<<1]; void ins(int x,int y,int z){ edge[++cnt].nxt=head[x]; edge[cnt].to=y;edge[cnt].val=z; head[x]=cnt; } void dfs(int x,int fa){ sz[x]=1;int flag=1; for(int i=head[x];i;i=edge[i].nxt){ int y=edge[i].to; if(y==fa) continue; dfs(y,x);flag=0; sz[x]+=sz[y];num[x]+=num[y]; }num[x]+=flag; } void calc(int x,int fa){ for(int i=head[x];i;i=edge[i].nxt){ int y=edge[i].to,z=edge[i].val; if(y==fa) continue;calc(y,x); int u1=num[1]-num[y],u2=sz[1]-sz[y]; ans+=u1*1ll*sz[y]*z;ans+=z*1ll*u2*num[y]; } } int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } signed main(){ n=read(),m=read(); for(int i=1;i<=m;i++){ int z=read(),x=read(),y=read(); ins(x,y,z),ins(y,x,z); }dfs(1,0);calc(1,0); printf("%lld\n",ans); return 0; }