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-1405-树的距离之和
- 51nod 1405 树的距离之和【树型dp】
- 51Nod 1405 树的距离之和(dp)
- 51nod 1405 树的距离之和
- 51nod 1405 树的距离之和 树形dp
- 51Nod 1405 树的距离之和 (树dp)
- 51nod 1405 树的距离之和 (两次dfs,树形dp)
- 51nod 1405 树的距离之和
- 51Nod 1405 树的距离之和(树形dp)
- 51nod 1405 树的距离之和 (两次dfs,树形dp)
- 51nod 1405 树的距离之和【树形dp】
- 51nod-1405 树的距离之和
- 51nod 1405 树的距离之和 【dfs--记忆dp??树形dp??】
- 51Nod 1405 树的距离之和(dp)
- 51nod 1405 树的距离和
- 51nod 1405 树的距离之和(dfs)
- 51nod 1405 树的距离之和(DFS)
- 51nod 1405 树的距离之和(DP)
- 51nod 1405 树的距离之和 搜索+DP
- 51nod 1405 树的距离之和(树型dp)