标签:
无意中想起图的强连通分量来,之前也一直想写所以今天决定来填这个坑。PS:由于本人比较懒,之前做过一个讲解的PPT,不过那是好遥远之前,年代已久早已失传,所以本文里的图来自网络。以后周末都用来填坑也挺好。
1 int index,bcnt; 2 int DFN[100],LOW[100],stack[100],belong[100]; 3 bool instack[100]; 4 5 void tarjan(int i) 6 { 7 int j; 8 DFN[i]=LOW[i]=++index; 9 instack[i]=true; 10 stack[++top]=i; 11 for (edge *e=V[i];e;e=e->next) 12 { 13 j=e->t; 14 if (!DFN[j])// 如果节点j未被访问过 15 { 16 tarjan(j); 17 if (LOW[j]<LOW[i]) 18 LOW[i]=LOW[j]; 19 } 20 else if (instack[j] && DFN[j]<LOW[i])// 如果节点j还在栈内 21 LOW[i]=DFN[j]; 22 } 23 if (DFN[i]==LOW[i])// 如果节点i是强连通分量的根 24 { 25 bcnt++; 26 do 27 { 28 j=stack[top--]; 29 instack[j]=false; 30 belong[j]=bcnt; 31 } 32 while (j!=i); 33 } 34 } 35 void solve() 36 { 37 int i; 38 top=bcnt=index=0; 39 memset(DFN,0,sizeof(DFN)); 40 for (i=1;i<=N;i++) 41 if (!DFN[i]) 42 tarjan(i); 43 }
标签:
原文地址:http://www.cnblogs.com/do-it-best/p/5380852.html