在环路上的两点一定可以,否则就不行。
用tarjan算法就可以解决
#include<cstdio>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 50500;
vector<int> a[maxn];
int dfn[maxn];
int low[maxn];
int vis[maxn];
int f[maxn];
stack<int> s;
int tot = 1;
void dfs(int k, int fa){
dfn[k] = low[k] = tot++;
if(a[k].size() == 1) return;
s.push(k);
vis[k] = 1;
for(int i = 0; i < a[k].size(); i++){
int t = a[k][i];
if(t == fa) continue;
if(dfn[t] == 0){
dfs(t, k);
low[k] = min(low[k], low[t]);
}else if(vis[t] == 1){
low[k] = min(low[k], dfn[t]);
}
}
if(low[k] == dfn[k]){
while(!s.empty() && s.top() != k){
vis[s.top()] = 0;
low[s.top()] = k;
s.pop();
}
if(!s.empty()) {
vis[s.top()] = 0;
s.pop();
}
}
}
int main(){
int n, m, k;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
int x, y;
scanf("%d%d", &x, &y);
a[x].push_back(y);
a[y].push_back(x);
}
for(int i = 1; i <= n; i++){
if(dfn[i] == 0){
dfs(i, i);
}
}
scanf("%d", &k);
for(int i = 1; i <= k; i++){
int x, y;
scanf("%d%d", &x, &y);
if(low[x] == low[y]) puts("YES");
else puts("NO");
}
return 0;
}