Problem Description
给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子
Input
输入的第一行为T,表示测试数据的组数。对于每组测试数据的第一行:n(结点数<=100),m(边数<=200)。以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。
Output
对于每组测试数据:
第一行:树根:root。
第二行:孩子最多的结点max。
第三行:max的孩子。
第一行:树根:root。
第二行:孩子最多的结点max。
第三行:max的孩子。
Sample Input
1 8 7 4 1 4 2 1 3 1 5 2 6 2 7 2 8
Sample Output
4 2 6 7 8
//标程:
#include<stdio.h> #include<map> using namespace std; struct ss { int x,y; }p[210]; int main() { //freopen("a.txt","r",stdin); int t,n,m,i,j,a,b,flag,ans; map<int,int> m1,m2; scanf("%d",&t); while(t--) { m1.clear(), m2.clear(); scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%d%d",&p[i].x,&p[i].y); m1[p[i].x]++, m2[p[i].y]++; } map<int,int>::iterator it1,it2; ans=flag=0; for(it1=m1.begin();it1!=m1.end();++it1) { ans=it1->first; for(it2=m2.begin();it2!=m2.end();++it2) if(ans==it2->first) flag=1; if(!flag) break; } printf("%d\n",ans); int maxn=0,node=0; for(it1=m1.begin();it1!=m1.end();++it1) if(it1->second>maxn) maxn=it1->second, node=it1->first; printf("%d\n",node); flag=0; for(i=0;i<m;i++) { if(p[i].x==node && flag==1) printf(" %d",p[i].y); if(p[i].x==node && flag==0) printf("%d",p[i].y), flag=1; } printf("\n"); } return 0; }