模板题:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL>PII;
const int nMax = 2e5+10;
int n,m;
int first[nMax],nxt[nMax],to[nMax],e;
void addadge(int u,int v)
{
to[e]=v;
nxt[e]=first[u];
first[u]=e;
e++;
to[e]=u;
nxt[e]=first[v];
first[v]=e;
e++;
}
int low[nMax],dfn[nMax],dep,belong[nMax],vis[nMax],st[nMax],top,cnt;
void tarjan(int u,int E)
{
low[u] = dfn[u] = dep;
dep++;
vis[u] = 1;
st[++top] = u;
for(int i=first[u]; i!=-1; i=nxt[i])
{
if((E^1) == i) continue;
if(!vis[to[i]])
{
tarjan(to[i],i);
low[u] = min(low[u],low[to[i]]);
}
else
{
low[u] = min(low[u],dfn[to[i]]);
}
}
if(low[u] == dfn[u])
{
do
{
belong[st[top]] = cnt;
}
while(top && st[top--] != u);
cnt ++;
}
}
void init(){
e=0;
dep=cnt=top=0;
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(nxt,-1,sizeof(nxt));
memset(first,-1,sizeof(first));
}
int main(){
int u,v;
scanf("%d%d",&n,&m);
init();
while(m--)
{
scanf("%d%d",&u,&v);
addadge(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i]){
tarjan(i,-1);
}
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d",&u,&v);
if(belong[u] == belong[v]) puts("Yes");
else puts("No");
}
return 0;
}