【转载优质文章】强连通算法--Tarjan个人理解+详解

原文传送入口
写(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

*/

另一篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值