您的位置:首页 > 其它

poj - 1655 Balancing Act

2012-11-08 23:03 399 查看
给出一个树,若去掉其中一个结点,剩下的子树中规模最大的树的规模(估且称为D值),就是该点的D值。求所有结点中D值最小的点,输出点及其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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: