Tarjan求強連通分量

2021-08-10 08:13:01 字數 480 閱讀 3527

強連通分量可以用tarjan求

比兩遍dfn大概快30%

定義乙個棧

把點壓進去,然後根據自己所能到的點,求出能到達的dfn序最小的點

由此得到從此點到low點中的點(在棧中)可以成為乙個強連通分量

具體實現是當x點滿足dfn==low時,將棧中的點全部彈出至x點;

可以證明每個點最多被彈出1次,每條邊最多被遍歷一次

複雜度為o(

n+m)

int col[n],sz[n],cnt,num,dfn[n],low[n];

bool mark[n];

int sk[n],r;

void tarjan(int x)

else

if(mark[y])chk_mi(low[x],dfn[y]);

}if(dfn[x]==low[x])while(y!=x);

}}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

Tarjan求強連通分量

強連通分量 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,則稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,成為強連通分量 strongly connected components 直...

tarjan求強連通分量

tarjan求強連通分量 我們知道,在有向圖g中,如果任意兩個頂點都是連通的 所謂連通就是兩個頂點都能互相到達 那麼這個圖就是強連通圖。非強連通圖的極大強連通子圖,被稱為強連通分量。那麼什麼是極大強連通子圖呢?舉個例子幫助理解一下 例如下面圖一所示,其中子圖就是乙個極大強連通子圖,子圖也是乙個極大強...