搜索强连通分量_Tarjan算法_C++实现

这篇博客介绍了如何使用Tarjan算法在C++中实现搜索强连通分量(SCC)。作者在未参考他人代码的情况下,根据byvoid的讲解自行编写了简单易懂的实现。虽然代码注重理解和直观性,而非追求极致效率,但通过测试,成功找到了图中的5个强连通分量。
摘要由CSDN通过智能技术生成

在byvoid的博客上学习了下Tarjan算法,在未看byvoid给出的C++代码情况下,自行写了一个简单的实现 ^^


注意:

为了快速编码,易阅读和理解代码,体会的算法的思路为主的思路下,我尽量使用标准库和符合人类直觉的编码,这不是执行效率优秀的代码。

// SCC_Tarjan_learning.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <list>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

//辅助类,查询出SCC
//V为节点数量,E为有向边数量
//O(V, E) = V + E
//O(V, E) = V + V + V + V(max) = 5V
class Assistant
{
private:
	size_t V;        //节点数量,约定节点编号为1..V-1
	size_t Index;    //索引值,表示遍历节点的次序值
	vector<list<size_t>> &Lines; //每个节点的有向边, Lines[N]保存编号为N的节点出发的有向边,list中保存的是目标节点的编号
	vector<bool> Visited; //标示节点是否已遍历,取值为false表示节点未遍历
	vector<size_t> DFN;   //保存节点的次序值(遍历的时间戳)
	vector<size_t> LOW;   //保存节点的最小次序值.具体的见算法中具体描述
	vector<s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值