Tarjan算法模板-求图的强连通分量算法模板C/C++代码实现内有详细注释

#include 
using namespace std;

//设置最大节点数 
const int maxv = 10005;

//邻接表中的节点结构体,next代表后继节点编号 
struct node{
	int next;
	node(int _n):next(_n){}
};

//DFN数组记录每个节点入栈的时间戳,DFN另一个作用可以检测该节点是否已经访问过;
//LOW节点记录每个节点的最小根节点 
int DFN[maxv],LOW[maxv];
//时间戳,相当于计时器,每搜索到一个节点index+1 
int index = 1;
//栈容器,每搜索到一个节点就将他入栈,等找到一个强连通分量之后就将该强连通分量的所有节点出栈 
int vstack[maxv];
//栈顶指针 
int top = -1;
//记录节点是否在栈中 
int flag[maxv];
//图的邻接表 
vector maze[maxv];
int n,m,ans;


//tarjan核心算法: 
void tarjan(int u){
	//每来访问一个几点,记录该节点的时间戳,并初始化它的最小根节点LOW 
	DFN[u]=LOW[u] = index++;
	//节点入栈 
	vstack[++top]=u;
	//置入栈标识为1 
	flag[u]=1;
	
	//遍历当前节点的所有后继节点 
	for(int i=0;i

 

你可能感兴趣的:(算法,笔记)