#include #include #include #include #include #include #include #include #include #include #include #define N 20200 #define inf 10000000 using namespace std; inline int Min(int a,int b){return a>b b:a;} inline int Max(int a,int b){return a 这是反向弧 Low[u] = Min(Low[u], DFN[v]); } if(DFN[u] == Low[u])//反向弧在u及u以下 { taj++; while(1){ int now = Stack[--top]; vis[now] = 0; belong[now] = taj; if(now == u)break; } } } void tarjan_init(){ memset(head, -1, sizeof(head)); edgenum = 0; memset(DFN, -1, sizeof(DFN)); memset(Low, -1, sizeof(Low)); memset(vis, 0, sizeof(vis)); taj = top = 0; Time = 0; } int n, m; int outde[N], inde[N]; int main(){ int i,j,u,v; while(~scanf("%d %d",&n,&m)){ tarjan_init(); while(m--){ scanf("%d %d",&u,&v); addedge(u, v); } for(i=1;i<=n;i++)if(DFN[i]==-1)tarjan(i); if(taj == 1 || n<1){printf("0\n");continue;} int ans1 = 0, ans2 = 0; memset(inde, 0, sizeof(inde)); memset(outde,0, sizeof(outde)); for(i = 0;i