#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
stack<int> s;
int head[N], e[N], ne[N], cnt;
int dfn[N], low[N];
int vtag[N];
int b[N];
int times;
void add(int a, int b) {
e[cnt] = b;
ne[cnt] = head[a];
head[a] = cnt ++;
}
void dfs(int t,int u) {
dfn[t] = low[t] = times ++;
s.push(t);
vtag[t] = 1;
for(int i = head[t]; ~i; i = ne[i]) {
int to = e[i];
if(!dfn[to]) {
dfs(to, t);
low[t]=min(low[t], low[to]);
}
if(vtag[to] && to != u)
low[t] = min(low[t], dfn[to]);
}
if(low[t] == dfn[t]) {
while(s.top() != t) {
vtag[s.top()] = 0;
b[s.top()] = t;
s.pop();
}
b[s.top()] = t;
s.pop();
}
}
int main() {
memset(head, -1, sizeof head);
int n, m, q;
cin >> n >> m;
int x, y;
for(int i = 0; i < m; ++ i) {
cin >> x >> y;
add(x, y);
add(y, x);
}
for(int i = 1;i <= n; ++ i)
if(!dfn[i])dfs(i, 0);
cin >> q;
for(int i = 0; i < q; ++ i) {
cin >> x >> y;
if(b[x] == b[y]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
tarjan算法模板
最新推荐文章于 2021-08-08 08:07:32 发布