#include struct edge{int e, nxt;}; int V, E; edge e[MAXE], er[MAXE]; int sp[MAXV], spr[MAXV]; int group_cnt, group_num[MAXV]; bool v[MAXV]; int stk[MAXV]; void fill_forward(int x) { int i; v[x]=true; for(i=sp[x];i;i=e[i].nxt) if(!v[e[i].e]) fill_forward(e[i].e); stk[++stk[0]]=x; } void fill_backward(int x) { int i; v[x]=false; group_num[x]=group_cnt; for(i=spr[x];i;i=er[i].nxt) if(v[er[i].e]) fill_backward(er[i].e); } void add_edge(int v1, int v2) //add edge v1->v2 { e [++E].e=v2; e [E].nxt=sp [v1]; sp [v1]=E; er[ E].e=v1; er[E].nxt=spr[v2]; spr[v2]=E; } void SCC() { int i; stk[0]=0; memset(v, false, sizeof(v)); for(i=1;i<=V;i++) if(!v[i]) fill_forward(i); group_cnt=0; for(i=stk[0];i>=1;i--) if(v[stk[i]]){group_cnt++; fill_backward(stk[i]);} }