#include #include #include #include using namespace std; const int maxn=105; int n,m; bool ins[maxn]; int head[maxn],belong[maxn],out[maxn],in[maxn]; int low[maxn],dfn[maxn]; stacks; int cnt=0,num=0,id=0; struct Egde { int to,next; }e[maxn*maxn]; void add(int u,int v) { e[++cnt].to=v; e[cnt].next=head[u]; head[u]=cnt; } void tarjan(int u)//有向图连通分量求解 { low[u]=dfn[u]=++num; ins[u]=true; s.push(u); for(int i=head[u];i;i=e[i].next) { int v=e[i].to; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(ins[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { int v; id++; do { v=s.top(); s.pop(); belong[v]=id; ins[v]=false; }while(v!=u); } } int main() { //ios::sync_with_stdio(0);//syn加速 cin>>n; for(int i=1;i<=n;i++) { int v; while(cin>>v&&v) add(i,v); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); for(int u=1;u<=n;u++) for(int i=head[u];i;i=e[i].next) { int v=e[i].to; if(belong[u]!=belong[v]) { in[belong[v]]++; out[belong[u]]++; } } if(id==1) { cout<<1<