有向圖強連通分支

Enjoy_process發表於2018-09-04

定義

在有向圖G中,如果任意兩個不同的頂點相互可達,則稱該有向圖是強連通的。有向圖G的極大強連通子圖稱為G的強連通分支。

Tarjan演算法

dfn[i]表示編號為i的節點在DFS過程中的訪問序列(也可以叫做開始時間)。在DFS過程中會形成一搜尋樹。在搜尋樹上越先遍歷到的節點,dfn值越小

low[i]表示從i節點出發DFS過程中i下方結點(開始時間大於dfn[i],且由i可達的節點)所能到達的最早的節點的開始時間,初始時dfn[i]=low[i]

void Tarjan(int u)
{
	dfn[u]=low[u]=++index;
	stack.push(u);
	for each(u,v) in E{
		if(v is not visted){
			tarjan(v);
			low[u]=min(low[u],low[v];)
		}
		else if(v in stack)
			low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){ //u是一個強連通分量的根 
		do{
			v=stack.pop
			print v
            標記v不在棧中
		}while(u!=v)//退棧,把整個強連通分量都彈出來 
	}
}//複雜度O(E+V) 

問題集錦:

CCF 201509-4 高速公路(100分)

相關文章