Tarjan 妯℃澘
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tarjan 妯℃澘相关的知识,希望对你有一定的参考价值。
鏍囩锛?a href='http://www.mamicode.com/so/1/code' title='code'>code
16px targe get lan stack min target ret鎰熻阿 閿洏閲岀殑闈掓槬 鍓嶈緢璇︾粏璁茶В
鍏堝紑鍧?/span>
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 const int MAXN=1000+5; 7 struct Edge 8 { 9 int to,next; 10 }E[MAXN]; 11 int node,head[MAXN]; 12 int DFN[MAXN],LOW[MAXN],stack[MAXN]; 13 int vis[MAXN],index,tot; 14 15 void insert(int u,int v) 16 { 17 E[++node]=(Edge){v,head[u]};head[u]=node; 18 } 19 20 void tarjan(int x) 21 { 22 DFN[x]=LOW[x]=++index; 23 stack[++tot]=x; 24 vis[x]=1; 25 for(int i=head[x];i;i=E[i].next) 26 { 27 if(!DFN[E[i].to]) 28 { 29 tarjan(E[i].to); 30 LOW[x]=min(LOW[x],LOW[E[i].to]); 31 } 32 else if(vis[E[i].to]) 33 LOW[x]=min(LOW[x],DFN[E[i].to]); 34 } 35 if(LOW[x]==DFN[x]) 36 { 37 do 38 { 39 printf("%d ",stack[tot]); 40 vis[stack[tot]]=0; 41 tot--; 42 }while(x!=stack[tot+1]); 43 printf(" "); 44 } 45 } 46 47 int main() 48 { 49 int n,m; 50 scanf("%d %d",&n,&m); 51 for(int i=1;i<=m;i++) 52 { 53 int x,y; 54 scanf("%d %d",&x,&y); 55 insert(x,y); 56 } 57 for(int i=1;i<=n;i++) 58 if(!DFN[i]) tarjan(i); 59 return 0; 60 }
以上是关于Tarjan 妯℃澘的主要内容,如果未能解决你的问题,请参考以下文章