```cpp
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX 101
#define MAXL 10001
int h[MAX],cnt=0;
int Dfn[MAX],Low[MAX],Be[MAX];
bool vis[MAX];
int Time=0,top=0,Group=0,n;
int S[MAX];//栈
int In[MAX],Out[MAX];
vector<int> G[MAX];
struct Node
{
int v;
int next;
}e[MAXL*2];
void Add(int u,int v)
{
e[cnt]=(Node){v,h[u]};
h[u]=cnt++;
}
void Tarjan(int u)
{
++Time;
Dfn[u]=Low[u]=Time;
S[++top]=u;
vis[u]=true;
int v;
for(int i=h[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(!Dfn[v])
{
Tarjan(v);
Low[u]=min(Low[u],Low[v]);
}
else
if(vis[v])
Low[u]=min(Low[u],Dfn[v]);
}
if(Low[u]==Dfn[u])
{
++Group;
v=-1;
while(v!=u)
{
v=S[top--];
vis[v]=false;
G[Group].push_back(v);
Be[v]=Group;
}
}
}
int main()
{
int a;
memset(h,-1,sizeof(h));
cin>>n;
for(int i=1;i<=n;++i)
while(cin>>a&&a)
Add(i,a);
for(int i=1;i<=n;++i)
if(!Dfn[i])
Tarjan(i);
if(Group==1)
{
cout<<1<<endl<<0<<endl;
return 0;
}
for(int i=1;i<=n;++i)
{
for(int j=h[i];j!=-1;j=e[j].next)
{
if(Be[i]!=Be[e[j].v])
{
In[Be[e[j].v]]++;
Out[Be[i]]++;
}
}
}
int ans1=0,ans2=0;
for(int i=1;i<=Group;++i)
{
if(Out[i]==0)
++ans1;
if(In[i]==0)
++ans2;
}
cout<<ans2<<endl<<max(ans2,ans1)<<endl;
//cout<<Group<<endl;
return 0;
}
```
by yybyyb @ 2017-06-06 15:20:29
所以问题在哪里呢
by walk_alone @ 2018-11-01 18:52:18