tarjan乱搞,判下入度出度
WA了一把……tarjan出栈的时候忘记打标机了
#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXN 105
using namespace std; int n;
struct t1{
int to,nxt;
}edge[(MAXN*MAXN)<<1]; int cnt_edge=0;
int fst[MAXN];
void addedge(int x,int y){
edge[++cnt_edge].to=y;
edge[cnt_edge].nxt=fst[x];
fst[x]=cnt_edge;
}
int dfn[MAXN],low[MAXN],cnt_dfs=0;
int col[MAXN],cnt_col=0;
int stk[MAXN],top=0;
int in_stk[MAXN];
void tarjan(int now){
dfn[now]=low[now]=++cnt_dfs;
stk[++top]=now,in_stk[now]=1;
for(int tmp=fst[now];tmp;tmp=edge[tmp].nxt){
int aim=edge[tmp].to;
if(!dfn[aim]) tarjan(aim),low[now]=min(low[aim],low[now]);
else
if(in_stk[aim])
low[now]=min(low[now],dfn[aim]);
}
if(dfn[now]==low[now]){
++cnt_col;
for(;stk[top]!=now;--top) col[stk[top]]=cnt_col,in_stk[stk[top]]=0;
col[stk[top--]]=cnt_col,in_stk[now]=0;
}
}
int re_grp[MAXN][MAXN];
int ind[MAXN],oud[MAXN];
void re_build(){
for(int i=1;i<=n;++i){
for(int tmp=fst[i];tmp;tmp=edge[tmp].nxt){
int j=edge[tmp].to;
if(col[i]^col[j])
++re_grp[col[i]][col[j]],++ind[col[j]],++oud[col[i]];
}
}
}
int read_x;
int main(){
// freopen("orz.out","w",stdout);
// freopen("1.in","r",stdin);
scanf("%d",&n);
for(int i=1,read_x;i<=n;++i)
for(scanf("%d",&read_x);read_x;addedge(i,read_x),scanf("%d",&read_x));
for(int i=1;i<=n;++i)
if(!dfn[i]) tarjan(i);
/*
for(int i=1;i<=n;++i)
printf("col[ %d ] = %d\n",i,col[i]);
puts("");
*/
if(cnt_col==1) return puts("1\n0");
re_build();
/*
for(int i=1;i<=cnt_col;++i)
printf("ind[ %d ] = %d oud[ %d ] = %d\n",i,ind[i],i,oud[i]);
*/
int cnt_S=0,cnt_T=0;
for(int i=1;i<=cnt_col;++i)
cnt_S+=(!ind[i]),cnt_T+=(!oud[i]);
printf("%d\n%d\n",cnt_S,max(cnt_S,cnt_T));
return 0;
}