找树根和孩子

来源:互联网 发布:好的高中数学软件 编辑:程序博客网 时间:2024/05/01 05:13

找树根和孩子

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

18 74 14 21 31 52 62 72 8

Sample Output

42 6 7 8
i12345678father44101222child13020000

/*首先读入数据,将每个点的父节点存入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;}


原创粉丝点击