點於點之間的強連通(u,v):同時存在 u 至 v 的路徑,以及 v 至 u 的路徑,那麼表示u、v兩點是強連通。
強連通圖:如果乙個圖中的任意兩點都是強連通,那麼該圖就是強連通圖。
解決該問題的演算法:tarjan演算法
說明:配題:hdu 1269(中文題)
思想:通過給強連通分量進行著色,如果最後的顏色只有乙個的話,那麼就表示該圖是強連通圖。
#include#include#include#include#includeusing namespace std;
const int max_n = 10005;
const int max_m = 100005;
int n, m;
struct node
;vectorgraph[max_n];
stacks;
int dfn[max_n], low[max_n];
bool instack[max_n];
int index;
int col[max_n];
int col_cnt;
int min(const int& a, const int& b)
void tarjan(int u)
else if (instack[v])
}if (dfn[u] == low[u])
while (v != u); }}
int main()
col_cnt = 0;
index = 0;
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(instack, false, sizeof(instack));
memset(col, 0, sizeof(col));
while (!s.empty()) s.pop();
for (int i = 1; i <= n; i++)
for (int i = 1; i <= m; i++)
for (int i = 1; i <= n; i++)
}if (col_cnt == 1)
else
}return 0;
}
強連通分量Tarjan演算法
o v e 通常的tarjan寫法是有個dfn陣列跟乙個instack陣列,我精簡了下 把這兩個陣列都刪去了,用更簡便的寫法代替,也省了空間。int low maxn 記錄這棵樹能到達的最早祖先 其實不一定是最早,但不影響使用 int time 時間戳 int num 連通分量的個數 int bel...
強連通分量 tarjan演算法
強連通分量 tarjan演算法 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected com...
強連通分量 Tarjan演算法
有向圖強連通分量 在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。tarjan 演算法是基於對圖優先搜素的演算法 每...