Strongly Connected Components
#include <memory.h>
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) {
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]);
}
}