找树根和孩子
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;
}