题目链接:https://vjudge.net/problem/FZU-2038
题意:n个城市,n-1条边,每个城市都有一个邮递员,问,每个城市的每个邮递员到其他所有城市一共需要的权值和
题解:枚举每一条边,求一下每条边的贡献值,贡献次数为:左边的城市数*右边的城市数*2
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=100100;
struct edge{
int to,d,nex;
}e[N*2];
int n;
int head[N],len;
int dp[N];
ll ans;
void init()
{
len=0;
ans=0;
for(int i=0;i<=n;i++)
{
head[i]=-1;
}
}
void add(int x,int y,int z)
{
e[len].to=y;
e[len].d=z;
e[len].nex=head[x];
head[x]=len++;
}
void dfs(int u,int f)
{
int to;
dp[u]=1;
for(int i=head[u];i!=-1;i=e[i].nex)
{
to=e[i].to;
if(to==f) continue;
dfs(to,u);
ans += (ll)dp[to]*(ll)(n-dp[to])*(ll)e[i].d*2;
dp[u] += dp[to];
}
}
int main()
{
int T;
int nn=1;
int x,y,z;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
init();
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dfs(0,-1);
printf("Case %d: %lld\n",nn++,ans);
}
return 0;
}