POJ 1691 dfs
http://poj.org/problem?id=1655
跟3107差不多
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define Min(a,b)a<b?a:b
#define Max(a,b)a>b?a:b
#define MAX 20005
using namespace std;
int head[MAX],sumVal[MAX];
int n,s_edge,ans_node,ans_cnt;
bool vs[MAX];
struct Edge
{
int to,nxt;
}edge[MAX*2];
void addedge(int u,int v)
{
s_edge++;
edge[s_edge].to=v;
edge[s_edge].nxt=head[u];
head[u]=s_edge;
s_edge++;
edge[s_edge].to=u;
edge[s_edge].nxt=head[v];
head[v]=s_edge;
}
void dfs(int x)
{
vs[x]=1;
sumVal[x]=1;
int maxSub=0,SUM;
for(int e=head[x];e;e=edge[e].nxt)
{
int v=edge[e].to;
if(!vs[v])
{
dfs(v);
sumVal[x]+=sumVal[v];
maxSub=Max(maxSub,sumVal[v]);
}
}
SUM=Max(maxSub,n-sumVal[x]);
if(SUM<ans_cnt)
{
ans_cnt=SUM;
ans_node=x;
}
}
int main()
{
int CASE,i,a,b;
scanf("%d",&CASE);
while(CASE--)
{
scanf("%d",&n);
s_edge=0;
memset(head,0,sizeof(head));
memset(vs,0,sizeof(vs));
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
}
ans_cnt=MAX;
dfs(1);
printf("%d %d\n",ans_node,ans_cnt);
}
return 0;
}

浙公网安备 33010602011771号