強連通分量可以用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中,如果任意兩個頂點都是連通的 所謂連通就是兩個頂點都能互相到達 那麼這個圖就是強連通圖。非強連通圖的極大強連通子圖,被稱為強連通分量。那麼什麼是極大強連通子圖呢?舉個例子幫助理解一下 例如下面圖一所示,其中子圖就是乙個極大強連通子圖,子圖也是乙個極大強...