找樹根和孩子
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的孩子。
第一行:樹根: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;
}
#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;
}