题目:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1076
转载出处:https://www.byvoid.com/zhs/blog/scc-tarjan http://blog.youkuaiyun.com/qq_32734731/article/details/77102372
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack>
#define maxn 50005
#define lson step<<1
#define rson step<<1|1
using namespace std;
stack<int>s;
vector<int>v[maxn];
int DFN[maxn];//时间戳
int low[maxn];
int visit[maxn];
int B[maxn];
int times;
int n,m,Q;
void dfs(int t,int u)
{
DFN[t]=low[t]=times++;//初始化dfn和low数组
s.push(t);//进栈
visit[t]=1;//表示在栈中
for(int i=0;i<v[t].size();i++)
{
if(!DFN[v[t][i]])//如果没被访问过
{
dfs(v[t][i],t);
low[t]=min(low[t],low[v[t][i]]);
}
else if(visit[v[t][i]]==1&&v[t][i]!=u)//如果在栈中,并且不可逆
low[t]=min(low[t],DFN[v[t][i]]);
}
if(DFN[t]==low[t])
{
while(s.top()!=t)
{
visit[s.top()]=0;
B[s.top()]=t;
s.pop();
}
visit[s.top()]=0;
B[s.top()]=t;
s.pop();
}
}
int main()
{
while(cin>>n>>m)
{
memset(B,0,sizeof(B));
memset(visit,0,sizeof(visit));
memset(DFN,0,sizeof(DFN));
memset(low,0,sizeof(low));
times=1;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
if(!DFN[i])
dfs(i,0);
}
cin>>Q;
for(int i=0;i<Q;i++)
{
int a,b;
cin>>a>>b;
if(B[a]==B[b])
cout << "Yes\n";
else
cout << "No\n";
}
}
return 0;
}