强连通定义
定义 |
---|
在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶点强连通(strongly connected)。 |
如果有向图G的每两个顶点都强连通,称G是一个强连通图 |
非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。 |
求强连通子图有这么几个算法 |
|
1.kosaraju
过程 |
---|
https://www.cnblogs.com/nullzx/p/6437926.html |
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 10000;
vector<int> G[MAX];
vector<int> G_t[MAX];
int N, M, ds, ans;
int time[MAX];
bool vis[MAX];
void dfs(int x)
{
vis[x] = 1;
for (auto e : G[x])
{
if (!vis[e])
dfs(e);
}
time[++ds] = x;
}
int order[MAX];
void redfs(int x)
{
vis[x] = 1;
order[x] = ans;
for (auto e : G_t[x])
{
if (!vis[e])
redfs(e);
}
}
void orderdfs(int k)
{
vis[k] = 1;
cout << k << ' ';
for (auto e : G[k])
{
if (!vis[e] && (order[e] == order[k]))
{
orderdfs(e);
}
}
}
void kosaraju()
{
for (int i = 1; i <= N; i++)
{
if (!vis[i])
dfs(i);
}
fill(vis, vis + MAX, 0);
for (int i = N; i >= 1; i--)
{
if (!vis[time[i]])
{
redfs(time[i]);
ans++;
}
}
cout << ans << endl;
fill(vis, vis + MAX, 0);
for (int i = 1; i <= N; i++)
{
if (!vis[i])
{
orderdfs(i);
cout << endl;
}
}
}
int main()
{
cin >> N >> M;
for (int i = 1; i <= M; i++)
{
int x, y;
cin >> x >> y;
G[x].push_back(y);
G_t[y].push_back(x);
}
kosaraju();
return 0;
}