1.強連通分量是什麼?
強連通分量:在有向圖g中,如果兩個頂點,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。
2.tarjan演算法的原理
我們對於圖進行深度優先搜尋,將當前搜尋路徑上的點加入乙個棧中,若對當前節點的處理完後在棧中依次彈出知道當前節點所能追溯到的最早節點
所以我們就能得到乙個這樣的偽**:
void dfs(int x)
我們有兩個陣列dfn和low
dfn[x]為節點x搜尋的次序
low[x]為節點x能追溯到的最早棧中節點搜尋次序
所以可以得到如下**:
void dfs(int x)
else
if(vis[to])//若訪問過
low[x]=min(low[x],dfn[to]);//儲存最早棧中節點
}if(dfn[x]==low[x])
top--;
}return ;
}
我們發現,對於每個點都只入棧一次
所以時間複雜度很優,為 o(
n+m)
o (n
+m
)完整**如下:
void dfs(int x)
else
if(vis[to])
low[x]=min(low[x],dfn[to]);
}if(dfn[x]==low[x])
top--;
}return ;
}void tarjan()
void clear_edge()
void dfs(int x)
}return ;
}
強連通分量 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
洛谷 p2812 校園網路 洛谷 p3387 縮點 include include include include include using namespace std struct arrbot 1100000 d 1100000 int head 20000 h 20000 stack 200...
強連通分量 tarjan
struct enodeedge maxm int p maxn ec void inserte int u,int v,int w int dfn maxn ctime,low maxn 時間戳,時間戳計數,祖先時間。int gid maxn gc 分量陣列,分量計數。bool ins maxn ...