您的位置:首页 > 其它

找树根和孩子

2013-11-18 20:42 218 查看


找树根和孩子


Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)


Total Submission(s) : 14 Accepted Submission(s) : 6


Font: Times New Roman | Verdana | Georgia


Font Size: ← →


Problem Description

给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子


Input

输入的第一行为T,表示测试数据的组数。对于每组测试数据的第一行:n(结点数<=100),m(边数<=200)。以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。


Output

对于每组测试数据:

第一行:树根: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

i12345678
father44101222
child13020000



/*首先读入数据,将每个点的父节点存入father数组中,遍历一边哪个点没有父节点就是根节点,读入的同时将每个父节点拥有的孩子数存入child数组中,即可求出哪个节点孩子最多,具体数据样例如上表所示*/
#include<iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main ()
{
int a,b,j,q;
int father[1050],child[1050];
int t;
int  n,m,max1;
scanf("%d",&t);
while(t--)
{  max1=0;
q=0;
memset(father,0,sizeof(father));
memset(child,0,sizeof(child));
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
father[b]=a;
child[a]++;
}

for(int i=1; i<=n; i++)
{
if(father[i]==0)
printf("%d\n",i);
}
for(int i=1;i<=n;i++)
{
if(max1<child[i])
{
max1=child[i];//记录个数用于输出格式
j=i;
}
}
printf("%d\n",j);
for(int i=1;i<=n;i++)
{
if(father[i]==j)
{
q++;
if(q!=max1)//如果不是最后一个就输出一个空格最后一个则不要输出空格
printf("%d ",i);
else
printf("%d",i);
}
}
printf("\n");
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: