SCC.cc 797 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include<memory.h>
  2. struct edge{int e, nxt;};
  3. int V, E;
  4. edge e[MAXE], er[MAXE];
  5. int sp[MAXV], spr[MAXV];
  6. int group_cnt, group_num[MAXV];
  7. bool v[MAXV];
  8. int stk[MAXV];
  9. void fill_forward(int x)
  10. {
  11. int i;
  12. v[x]=true;
  13. for(i=sp[x];i;i=e[i].nxt) if(!v[e[i].e]) fill_forward(e[i].e);
  14. stk[++stk[0]]=x;
  15. }
  16. void fill_backward(int x)
  17. {
  18. int i;
  19. v[x]=false;
  20. group_num[x]=group_cnt;
  21. for(i=spr[x];i;i=er[i].nxt) if(v[er[i].e]) fill_backward(er[i].e);
  22. }
  23. void add_edge(int v1, int v2) //add edge v1->v2
  24. {
  25. e [++E].e=v2; e [E].nxt=sp [v1]; sp [v1]=E;
  26. er[ E].e=v1; er[E].nxt=spr[v2]; spr[v2]=E;
  27. }
  28. void SCC()
  29. {
  30. int i;
  31. stk[0]=0;
  32. memset(v, false, sizeof(v));
  33. for(i=1;i<=V;i++) if(!v[i]) fill_forward(i);
  34. group_cnt=0;
  35. for(i=stk[0];i>=1;i--) if(v[stk[i]]){group_cnt++; fill_backward(stk[i]);}
  36. }