您的位置:首页 > 其它

51nod 1405 树的距离之和

2016-11-03 21:11 375 查看
#include <bits/stdc++.h>
using namespace std;

const int MAXN=100100;
vector<int> eg[MAXN];
long long sonsum[MAXN],dp[MAXN];
long long n;

long long dfs1(int x,int fa)
{
long long ret=0;
sonsum[x]=1;
for(int i=0;i<eg[x].size();i++)
{
if(eg[x][i]==fa)
continue;
ret+=dfs1(eg[x][i],x);
sonsum[x]+=sonsum[eg[x][i]];
}
ret+=sonsum[x]-1;
return ret;
}

void dfs2(int x,int fa)
{
for(int i=0;i<eg[x].size();i++)
{
if(eg[x][i]==fa)
continue;
dp[eg[x][i]]=dp[x]+n-2*sonsum[eg[x][i]];
dfs2(eg[x][i],x);
}
}

int main()
{
int i,u,v;
while(cin>>n)
{
for(i=1;i<=n;i++)
eg[i].clear();
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
eg[u].push_back(v);
eg[v].push_back(u);
}
dp[1]=dfs1(1,0);
dfs2(1,0);
for(i=1;i<=n;i++)
printf("%lld\n",dp[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod