模板題目:
kosaraju:按順序對原圖和反圖dfs一遍,在第二次dfs時點u可達未dfs的點v則u,v屬於同乙個聯通分量
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 5005;
int out[maxn];
int in[maxn];
vectorg[maxn];
vectorgr[maxn];
vectorrg[maxn];
vectorp[maxn];
vectorps;
int id[maxn];
int n, m;
bool vis[maxn];
void dfs(int u)
ps.push_back(u);
}void rdfs(int u, int x)
}void init()
}int kosaraju()
memset(vis, 0, sizeof(vis));
for(int i = ps.size() - 1; i + 1; i--)
return res;
}void get_dag()}}
}int main()
kosaraju();
get_dag();
vectorans;
for(int i = 1; i <= n; i++)}}
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++)
}return 0;
}
tarjan:對於乙個強連通分量,其中的第乙個點被dfs搜到的時候,接著一定是整個聯通分量被遍歷完並且回到最開始的點,這時候就可以對該dfs子樹進行整體編號
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 5005;
int out[maxn];
stacks;
vectorg[maxn];
vectorrg[maxn];
vectorp[maxn];
bool isinstack[maxn];
int low[maxn], dfn[maxn];
int id[maxn];
int n, m, ssc_num, index;
void get_dag()}}
}void init()
void tardfs(int u)
else if(isinstack[v])
}if(dfn[u] ==low[u])
isinstack[u] = 0;
id[u] = ssc_num;
p[ssc_num].push_back(u);
s.pop();
}}int tarjan()
}return ssc_num;
}int main()
tarjan();
get_dag();
vectorans;
for(int i = 1; i <= n; i++)}}
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++)
}return 0;
}
強連通分量 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演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...