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_强联通分量的主要内容,如果未能解决你的问题,请参考以下文章