#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int n;
bool used[150];
vector<int> g[150],rg[150],vs,v;
void dfs(int v,vector<int>& vs)
{
used[v]=true;
for(int i=0;i<g[v].size();i++)
{
int &u=g[v][i];
if(!used[u])
dfs(u,vs);
}
vs.push_back(v);
}
void rdfs(int v,vector<int> &vs)
{
used[v]=true;
for(int i=0;i<rg[v].size();i++)
{
int &u=rg[v][i];
if(!used[u])
rdfs(u,vs);
}
vs.push_back(v);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int num;
while(scanf("%d",&num),num)
{
g[i].push_back(num);
rg[num].push_back(i);
}
}
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
{
if(!used[i])
dfs(i,vs);
}
memset(used,0,sizeof(used));
int ans1=0;
for(int i=vs.size()-1;i>=0;i--)
{
if(!used[vs[i]])
{
ans1++;
dfs(vs[i],v);
}
}
memset(used,0,sizeof(used));
int k=0;
for(int i=vs.size()-1;i>=0;i--)
{
if(!used[vs[i]])
{
rdfs(vs[i],v);
k++;
}
}
memset(used,0,sizeof(used));
int ans2=0;
for(int i=v.size()-1;i>=0;i--)
{
if(!used[v[i]])
{
ans2++;
rdfs(v[i],vs);
}
}
printf("%d\n",ans1);
if(k==1)
printf("0\n");
else
printf("%d\n",max(ans1,ans2));
return 0;
}
poj1236 Network of Schools
最新推荐文章于 2024-02-06 19:17:23 发布