码迷,mamicode.com
首页 > 移动开发 > 详细

tarjan_强联通分量

时间:2017-10-27 19:06:46      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:mes   bsp   void   using   turn   ret   cin   ack   int   

#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_强联通分量

标签:mes   bsp   void   using   turn   ret   cin   ack   int   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7744765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!