您的位置:首页 > 其它

51nod 1405 树的距离之和(dfs)

2017-12-15 21:44 435 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1405
题意:



思路:

先求出所有点到根节点的距离,需要维护每棵子树的大小,然后就可以再来一次dfs依次求出别的点的距离。好像需要手动扩栈。

#pragma comment(linker, "/STACK:10240000,10240000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100000+5;
const int inf = 0x3f3f3f3f;

int n;
int num[maxn];
long long d[maxn];
vector<int> G[maxn];

void dfs(int u, int fa, int dep)
{
num[u] = 1;
d[1] += dep;
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i];
if(v==fa)  continue;
dfs(v,u,dep+1);
num[u] += num[v];
}
}

void dfs2(int u, int fa)
{
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i];
if(v==fa)  continue;
d[v] = d[u]+n-num[v]-num[v];
dfs2(v,u);
}
}

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