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; }