在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