練習賽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;
}
發佈了41 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章