tarjan_强联通分量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tarjan_强联通分量相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int UFS[1005],ins[1005];
int find(int a){
	return a==UFS[a]?a:find(UFS[a]);
}
void Union(int a,int b){
	UFS[find(a)]=find(b);
}
bool check(int a,int b){
	return find(a)==find(b);
}
stack<int> s;
int t[1005],lowlink[1005],T=0;
vector<int> mp[1005];
void tarjan(int a){
	ins[a]=1;
	t[a]=lowlink[a]=++T;
	s.push(a);
	for(int i=0;i<mp[a].size();i++)
		if(!t[mp[a][i]]){
			tarjan(mp[a][i]);
			lowlink[a]=min(lowlink[a],lowlink[mp[a][i]]);
		}
		else if(ins[mp[a][i]]) lowlink[a]=min(lowlink[a],t[mp[a][i]]);
	if(lowlink[a]==t[a])
		while(s.top()!=a){
			ins[a]=0;
			Union(s.top(),a);
			s.pop();
		}
}
int main(){
int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		mp[a].push_back(b);
	}
	for(int i=1;i<=n;i++)
		UFS[i]=i;
	tarjan(1);
	while(1){
		int a,b;
		cin>>a>>b;
		if(check(a,b))
			puts("Yes");
		else
			puts("No");
	}
	return 0;
}

 

以上是关于tarjan_强联通分量的主要内容,如果未能解决你的问题,请参考以下文章

tarjan算法 求所有联通分量

学习整理Tarjan:强连通分量+割点+割边

tarjan算法求强联通分量

Tarjan强联通分量模板

tarjan 强联通分量和割点

USACO06JAN The Cow Prom /// tarjan求强联通分量 oj24219