原文传送入口
写(chao)段代码熟悉熟悉:
//输出一个有向图的所有强连通分量
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node {
int v, next;
}edge[1001];
int dfn[1001], low[1001];
int stac[1001], heads[1001], vis[1001], cnt = 0, tot, index;
void add(int x, int y) {
edge[++cnt].next = heads[x];
edge[cnt].v = y;
heads[x] = cnt;
return;
}
void Tarjan(int x) {
dfn[x] = ++tot;
low[x] = dfn[x];
stac[++index] = x;
vis[x] = 1;
for (int i = heads[x];i != -1;i = edge[i].next) {
if (!dfn[edge[i].v]) {
Tarjan(edge[i].v);
low[x] = min(low[x], low[edge[i].v]);
}
else if (vis[edge[i].v]) low[x] = min(low[x], dfn[edge[i].v]);
}
if (low[x] == dfn[x]) {
do {
cout << stac[index] << ' ';
vis[stac[index]] = 0;
index--;
} while (x != stac[index + 1]);
cout << endl;
}
return;
}
int main() {
memset(heads, -1, sizeof(heads));
int n, m;
cin >> n >> m;
int x, y;
for (int i = 1;i <= m;i++) {
cin >> x >> y;
add(x, y);
}
for (int i = 1;i <= n;i++) {
if (!dfn[i]) Tarjan(i);
}
return 0;
}
/*
* 输入:
6 8
1 3
1 2
2 4
3 4
3 5
4 6
4 1
5 6
*输出:
6
5
3 4 2 1
*/