tarjan算法的实现

自己将tarjan算法实现了一遍,深入理解了一遍,感觉有所收获~~

 

 #include<iostream> using namespace std; int time=1,low[1000],dfn[1000]; int stack[1000],top=0; bool instack[1000]={false}; struct LIST { int v; LIST *next; }; LIST *head[1000]={NULL}; int min(int a,int b) { if(a<b) return a; return b; } void tarjan(int v) /*tarjan求强连通分支*/ { dfn[v]=low[v]=time++; /*标记点v的DFS遍历序号*/ stack[top++]=v; /*将点v入栈*/ instack[v]=true; /*标记点v已经在栈中*/ for(LIST *p=head[v];p!=NULL;p=p->next) /*遍历V能直接到达的点*/ if(!dfn[p->v]) /*如果v的邻接点没有入过栈*/ { tarjan(p->v); low[v]=min(low[v],low[p->v]); /*如果v能直接到达的这个点没在栈中,v的最早祖先为他们中的较小值*/ } else if(instack[p->v]) /*如果在栈中*/ low[v]=min(low[v],dfn[p->v]); /*如果在栈中,则v的最早祖先是他的序号和那个点的序号较小的*/ if(dfn[v]==low[v]) /*如果dfn[v]和low[v]相等,则说明v点是其所属强连通分支DFS遍历起点,这个强连通分支说有点都在v点之上*/ { cout<<"{ "; do { v=stack[--top]; instack[v]=false; cout<<v<<' '; }while(dfn[v]!=low[v]); cout<<"}"<<endl; } } int main() { int i,j,n,m; cin>>n; memset(dfn,0,sizeof(char)*4000); for(i=1;i<=n;i++) { cout<<i<<"的邻接点数量:"; cin>>m; cout<<"输入每个邻接点编号"; LIST *rear=head[i]; for(j=0;j<m;j++) /*创建邻接表*/ { if(!j) { rear=new LIST; head[i]=rear; } else { rear->next=new LIST; rear=rear->next; } rear->next=NULL; cin>>rear->v; } } for(i=1;i<=n;i++) if(!dfn[i]) /*如果i没有入过栈*/ tarjan(i); return 0; }

 

 

 

你可能感兴趣的:(算法,list,struct,null)