#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
bool map[110][110];//记录j是否是i的依赖点
int ans[110];//每个点的依赖点数目,一旦赋值就不会变,因为我们是倒着求ans值的,也就是从最少的点开始……
int dfs(int i)//返回节点i的依赖点,由于没有环形,所以一个点不可能即是间接依赖点又是直接依赖点
{
if(ans[i]) return ans[i];
int Max=0;
for(int j=1;j<=n;j++)
if(map[i][j])
Max=max(Max,dfs(j)+1);
ans[i]=Max;
return Max;
}
int main()
{
while(scanf("%d",&n),n)
{
memset(map,0,sizeof(map));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
int t;scanf("%d",&t);
for(int j=0;j<t;j++)
{
int a;
scanf("%d",&a);
map[i][a]=1;
}
map[0][i]=1;//假设节点0与所有节点有依赖关系,我们要构造一个树,那么0就是树根
}
dfs(0);
int ans_=1;
for(int i=2;i<=n;i++)
{
if(ans[i]>ans[ans_]) ans_=i;
}
printf("%d\n",ans_);
}
return 0;
}
uva10926
最新推荐文章于 2017-11-24 17:25:58 发布