51nod 1405 树的距离之和(dfs)
2017-12-15 21:44
435 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1405
题意:
思路:
先求出所有点到根节点的距离,需要维护每棵子树的大小,然后就可以再来一次dfs依次求出别的点的距离。好像需要手动扩栈。
题意:
思路:
先求出所有点到根节点的距离,需要维护每棵子树的大小,然后就可以再来一次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; }
相关文章推荐
- 51nod 1405 树的距离之和 【dfs--记忆dp??树形dp??】
- 51nod 1405 树的距离之和(DFS)
- 51nod 1405 树的距离之和 (两次dfs,树形dp)
- 51nod 1405 树的距离之和 (两次dfs,树形dp)
- 51nod 1405 树的距离之和(DP)
- 51Nod-1405-树的距离之和
- 51nod 1405 树的距离之和 (树形dp)
- 51nod 1405 树的距离之和(树型dp)
- 51Nod 1405 树的距离之和 (树dp)
- 51nod 1405【DFS】
- 51nod 1405 树的距离之和
- 51nod 1405 树的距离之和
- 51NOD-1405 树的距离之和(树形DP)
- 51nod 1405 树的距离之和
- 51nod 1405 树的距离之和 搜索+DP
- 51Nod 1405 树的距离之和(树形dp)
- 51nod 1405 树的距离之和【树形dp】
- 51nod 1405 树的距离之和 树形dp
- 51nod 1405 树的距离之和【树型dp】
- 51Nod 1405 树的距离之和(dp)