The Largest Generation (25)

来源:互联网 发布:数控编程案例 编辑:程序博客网 时间:2024/06/09 16:34

题目描述

A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level belong to the same generation.  Your task is to find the generation with the largest population.

输入描述:

Each input file contains one test case.  Each case starts with two positive integers N (<100) which is the total number of family members in the tree (and hence assume that all the members are numbered from 01 to N), and M (<N) which is the number of family members who have children.  Then M lines follow, each contains the information of a family member in the following format:ID K ID[1] ID[2] ... ID[K]where ID is a two-digit number representing a family member, K (>0) is the number of his/her children, followed by a sequence of two-digit ID's of his/her children. For the sake of simplicity, let us fix the root ID to be 01.  All the numbers in a line are separated by a space.


输出描述:

For each test case, print in one line the largest population number and the level of the corresponding generation.  It is assumed that such a generation is unique, and the root level is defined to be 1.

输入例子:

23 1321 1 2301 4 03 02 04 0503 3 06 07 0806 2 12 1313 1 2108 2 15 1602 2 09 1011 2 19 2017 1 2205 1 1107 1 1409 1 1710 1 18

输出例子:

9 4

我的代码(C++):

#include<iostream>using namespace std;int a[101][101],i,x,y,z,n,m,cnt[101],maxx=0,t;int dfs(int s){    int i,vis[101]={0},k=1;    vis[s]=1;    while(s!=1)    {        for(i=1;i<=n;i++)        {            if(a[s][i]==1 && vis[i]==0)            {                vis[i]=1;                s=i;                k++;                break;            }        }    }    return k;}int main(){    cin>>n>>m;if(n==1){cout<<1<<" "<<1<<endl;return 0;}    while(m--)    {        cin>>x>>y;        while(y--)        {            cin>>z;            a[z][x]=1;        }    }    for(i=2;i<=n;i++)    {        cnt[dfs(i)]++;        if(cnt[dfs(i)]>maxx)        {            maxx=cnt[dfs(i)];            t=dfs(i);        }    }    cout<<maxx<<" "<<t<<endl;    return 0;}

我的代码(Java):

import java.util.Scanner;public class Main {    public static int dfs(int s,int n,int a[][])    {        int i,vis[]=new int[101],k=1;        vis[s]=1;        while(s!=1)        {            for(i=1;i<=n;i++)            {                if(a[s][i]==1 && vis[i]==0)                {                    vis[i]=1;                    s=i;                    k++;                    break;                }            }        }        return k;    }    public static void main(String[] args) {        Scanner In=new Scanner(System.in);        int a[][]=new int[101][101];        int cnt[]=new int[101],max=0,t=0;        int n=In.nextInt(),m=In.nextInt();if(n==1) System.out.printf("%d %d\n",1,1);else{for(int i=0;i<m;i++){int x=In.nextInt(),y=In.nextInt();for(int j=0;j<y;j++){int z=In.nextInt();a[z][x]=1; }}for(int i=2;i<=n;i++){cnt[dfs(i,n,a)]++;if(cnt[dfs(i,n,a)]>max){max=cnt[dfs(i,n,a)];t=dfs(i,n,a);}}System.out.printf("%d %d\n", max,t);}    }}

我的代码(C语言):

#include<stdio.h>int a[101][101],i,x,y,z,n,m,cnt[101],maxx=0,t;int dfs(int s){    int i,vis[101]={0},k=1;    vis[s]=1;    while(s!=1)    {        for(i=1;i<=n;i++)        {            if(a[s][i]==1 && vis[i]==0)            {                vis[i]=1;                s=i;                k++;                break;            }        }    }    return k;}int main(){    scanf("%d%d",&n,&m);if(n==1){printf("%d %d\n",1,1);return 0;}    while(m--)    {        scanf("%d%d",&x,&y);        while(y--)        {            scanf("%d",&z);            a[z][x]=1;        }    }    for(i=2;i<=n;i++)    {        cnt[dfs(i)]++;        if(cnt[dfs(i)]>maxx)        {            maxx=cnt[dfs(i)];            t=dfs(i);        }    }    printf("%d %d\n",maxx,t);    return 0;}