SCC.cc 878 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. struct edge { int e, nxt; };
  2. int V, E;
  3. edge e[MAXE], er[MAXE];
  4. int sp[MAXV], spr[MAXV];
  5. int group_cnt, group_num[MAXV];
  6. bool v[MAXV];
  7. int stk[MAXV];
  8. void fill_forward(int x) {
  9. int i;
  10. v[x]=true;
  11. for(i = sp[x]; i; i = e[i].nxt)
  12. if(!v[e[i].e])
  13. fill_forward(e[i].e);
  14. stk[++stk[0]] = x;
  15. }
  16. void fill_backward(int x) {
  17. int i;
  18. v[x]=false;
  19. group_num[x] = group_cnt;
  20. for(i = spr[x]; i; i = er[i].nxt)
  21. if(v[er[i].e])
  22. fill_backward(er[i].e);
  23. }
  24. void add_edge(int v1, int v2) { //add edge v1->v2
  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. int i;
  30. stk[0] = 0;
  31. memset(v, false, sizeof(v));
  32. for(i = 1; i <= V; i++)
  33. if(!v[i])
  34. fill_forward(i);
  35. group_cnt = 0;
  36. for(i = stk[0]; i >= 1; i--)
  37. if(v[stk[i]]) {
  38. group_cnt++;
  39. fill_backward(stk[i]);
  40. }
  41. }