练习赛10.2.找树根和孩子

找树根和孩子

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 19 Accepted Submission(s) : 9
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

Author

思路分析:本题用两个数组一个来记录前面的数一个来记录后面的根节点的数。当在第二组数组找不到时候为root,然后是找最多子节点的根节点。
代码:#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
struct tmp
{
    int x,y;
}a[250];
int main()
{
    int t,n,m,i,j,ans,flag;
    scanf("%d",&t);
    map<int,int>s1,s2;
    while(t--)
    {
        s1.clear(),s2.clear();
        scanf("%d%d",&n,&m);
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
            s1[a[i].x]++,s2[a[i].y]++;
        }
        map<int,int>::iterator it1,it2;
        ans=flag=0;
        for(it1=s1.begin();it1!=s1.end();++it1)
        {
            ans=it1->first;
            for(it2=s2.begin();it2!=s2.end();++it2)
                if(ans==it2->first) flag=1;
               if(!flag) break;
        }
        printf("%d\n",ans);
        int max1=0,max2=0;
        for(it1=s1.begin();it1!=s1.end();++it1)
            if(it1->second>max1) max1=it1->second,max2=it1->first;
            printf("%d\n",max2);
            flag=0;
            for(i=0;i<m;i++)
            {
                if(a[i].x==max2&&flag==1) printf(" %d",a[i].y);
                if(a[i].x==max2&&flag==0) printf("%d",a[i].y),flag=1;
            }
            printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值