poj - 1655 Balancing Act
2012-11-08 23:03
399 查看
给出一个树,若去掉其中一个结点,剩下的子树中规模最大的树的规模(估且称为D值),就是该点的D值。求所有结点中D值最小的点,输出点及其D值。
这题用两次DFS,第一次求出所有结点的子结点数,第二次求出所有结点的D值。
这题用两次DFS,第一次求出所有结点的子结点数,第二次求出所有结点的D值。
#include <stdio.h> #include <string.h> #include <vector> #define N 20005 using namespace std; vector<int> ed ; int s ,w ,n; int max(int a,int b) { return a>b ?a :b ; } int dfs(int u, int fa) { int i; s[u] = 1; for(i = 0; i < ed[u].size(); i++) if(ed[u][i] != fa) s[u] += dfs(ed[u][i],u); //printf("s[%d]:%d\n",u,s[u]); return s[u]; } void cal(int u, int fa) { int &ans = w[u],i,v,t=n-1; ans = 0; for(i = 0; i < ed[u].size(); i++) if(ed[u][i] != fa) { v = ed[u][i]; cal(v,u); t -= s[v]; if(s[v] > ans) ans = s[v]; } ans = max(t,ans); //printf("f(%d):%d\n",u,ans); } int main() { int T,a,b,i,min,f; scanf("%d",&T); while(T--) { scanf("%d",&n); min = n; for(i = 1; i <= n; i++) ed[i].clear(); for(i = 1; i < n; i++) { scanf("%d%d",&a,&b); ed[a].push_back(b); ed[b].push_back(a); } dfs(1,0); cal(1,0); for(i = 1; i <= n; i++) if(w[i] < min) { min = w[i]; f = i; } printf("%d %d\n",f,min); } return 0; }
相关文章推荐
- poj-1655 Balancing Act(树的重心+树形dp)
- POJ 1655 Balancing Act(树的重心)
- POJ 1655 Balancing Act【树的重心】
- POJ 1655 Balancing Act 树的重心
- poj 1655 Balancing Act
- Poj 1655 Balancing Act (树的重心)
- POJ 1655 - Balancing Act 树形DP
- POJ 1655 Balancing Act 树形DP入门题
- poj 1655 Balancing Act 求树的重心
- poj 1655 Balancing Act
- POJ 1655 Balancing Act(求树的重心)
- poj 1655 Balancing Act(树形DP)
- POJ1655 Balancing Act(树的重心)
- POJ 1655 Balancing Act 笔记
- poj 1655 Balancing Act(求树的重心)
- poj 1655 Balancing Act (树形dfs)
- POJ 1655 Balancing Act (树的重心,常规)
- poj 1655 Balancing Act(树形DP,删点)
- POJ 1655 - Balancing Act
- POJ 1655 Balancing Act 焦点树