http://poj.org/problem?id=1655
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8295 | Accepted: 3416 |
Description
Input
Output
Sample Input
1 7 2 6 1 2 1 4 4 5 3 7 3 1
Sample Output
1 2
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int len,dp[40005],head[40005],n; int val[40005],sum[40005]; struct node { int now,next; }tree[40005]; void add(int x,int y) { tree[len].now=y; tree[len].next=head[x]; head[x]=len++; } void dfs(int root,int p) { int i,son,temp=0; sum[root]=1; for(i=head[root];i!=-1;i=tree[i].next) { //printf("i=%d\n",i); son=tree[i].now; if(son==p) { continue; } // printf("son=%d\n",son); dfs(son,root); sum[root]+=sum[son]; // printf("root,sum[%d]=%d,son,sum[%d]=%d\n",root,sum[root],son,sum[son]); temp=max(temp,sum[son]); // printf("temp=%d\n",temp); } //printf("ii=%d,root=%d\n",i,root); //printf("tttemp=%d\n",temp); dp[root]=max(temp,n-sum[root]); //printf("dp=%d\n",dp[root]); } int main() { int t,a,b,i,q; cin>>t; while(t--) { len=0; memset(dp,0,sizeof(dp)); memset(head,-1,sizeof(head)); cin>>n; for(i=1;i<n;i++) { scanf("%d%d",&a,&b); add(a,b); add(b,a); } dfs(1,-1); int ans=1; // for(i=1;i<=n;i++) // printf("dp=%d\n",dp[i]); for(i=2;i<=n;i++) { if(dp[ans]>dp[i]) ans=i; } printf("%d %d\n",ans,dp[ans]); } return 0; }