POJ 1655

http://poj.org/problem?id=1655

题意:有N个点,N-1条边生成一棵树  从中去点一个点  树就变成森林,记下森林中包含点最多的一棵树 及点的个数    求去哪个点使包含的点最少 ,叙述的不好  自己看题理解  

树形dfs

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=20005;

int visit[MAX],num[MAX],head[MAX],ans;
int n,mark,k,sum,sizemin;

struct{int v,next;}e[MAX*2];

void addedge(int u,int v)
{
k++;
e[k].v=v;
e[k].next=head[u];
head[u]=k;
return;
}

void dfs(int u)
{// cout<<"L"<<endl;
int i,t,min;
visit[u]=1;
num[u]=1;min=-1;
for(i=head[u];i;i=e[i].next)
{
t=e[i].v;
if(!visit[t])
{
dfs(t);
num[u]+=num[t];
min=max(min,num[t]);
}
}
min=max(min,n-num[u]);
if(min<sizemin)
{
ans=min;
mark=u;
sizemin=min;
}

return ;
}

int main()
{
int CASE,u,v,i;
scanf("%d",&CASE);
while(CASE--)
{
scanf("%d",&n);
k=0;
memset(head,0,sizeof(head));
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
// cout<<"no"<<endl;
memset(num,0,sizeof(num));
memset(visit,0,sizeof(visit));
k=0;
sizemin=MAX+10;
dfs(1);
printf("%d %d\n",mark,ans);


}
return 0;
}



posted @ 2011-11-26 23:04  快乐.  阅读(213)  评论(0编辑  收藏  举报