#include <bits/stdc++.h>
using namespace std;
const int N=20004;
int n,e,r,c,d,q,s,t,m,tmp,bnum;
int dfn[N],low[N],ti,dep[2*N],fa[2*N][20],lg[2*N];
bool is_cut[N],vis[N],bcc_vis[N];
vector<int>G[2*N],bcc[N],bcc_idx[N];
stack<int>T;
void tarjan(int u,int fa){
dfn[u]=low[u]=++ti;
T.push(u);
vis[u]=1;
int cnt=0;
for(auto v:G[u]){
if(dfn[v]==0){
cnt++;
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v]){
bnum++;
while(tmp!=v){
tmp=T.top();
T.pop();
bcc[bnum].push_back(tmp);
bcc_idx[tmp].push_back(bnum);
}
bcc[bnum].push_back(u);
bcc_idx[u].push_back(bnum);
}
if((u!=r && dfn[u]<=low[v]) || (u==r && cnt>1)){
is_cut[u]=1;
}
}
else{
low[u]=min(low[u],dfn[v]);
}
}
if(cnt==0 && fa==0){
bcc[++bnum].push_back(u);
bcc_idx[u].push_back(bnum);
}
}
void dfs(int x,int y){
dep[x]=dep[y]+1;
fa[x][0]=y;
for(int i=1;1<<i<=dep[x];i++){
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for(auto v:G[x]){
if(v!=y){
dfs(v,x);
}
}
}
int LCA(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
while(dep[x]>dep[y]){
x=fa[x][lg[dep[x]-dep[y]]-1];
}
if(x==y){
return y;
}
for(int k=lg[dep[x]]-1;k>=0;k--){
if(fa[x][k]!=fa[y][k]){
x=fa[x][k];
y=fa[y][k];
}
}
return fa[x][0];
}
int dis(int x,int y){
return dep[x]+dep[y]-2*dep[LCA(x,y)];
}
int main(){
cin>>n>>e;
for(int i=1;i<=e;i++){
cin>>c>>d;
G[c].push_back(d);
G[d].push_back(c);
}
for(int i=1;i<=2*n;i++){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
while(!T.empty()){
T.pop();
}
r=i;
tarjan(i,0);
}
}
for(int i=1;i<=n;i++){
G[i].clear();
int li=bcc_idx[i].size();
for(int j=0;j<li;j++){
G[i].push_back(n+bcc_idx[i][j]);
G[n+bcc_idx[i][j]].push_back(i);
}
}
dfs(1,0);
cin>>q;
while(q--){
cin>>s>>t>>m;
// cout<<endl<<(is_cut[m]?"true":"false")<<endl<<endl;
// for(int i=0;i<bcc_idx[s].size();i++)cout<<bcc_idx[s][i]<<" ";
// cout<<endl;
// for(int i=0;i<bcc_idx[t].size();i++)cout<<bcc_idx[t][i]<<" ";
// cout<<endl;
// for(int i=0;i<bcc_idx[m].size();i++)cout<<bcc_idx[m][i]<<" ";
// cout<<endl<<endl;
// cout<<dis(s,m)<<" "<<dis(m,t)<<" "<<dis(s,t)<<endl;
if(!is_cut[m]){
cout<<"no"<<endl;
continue;
}
int ls=bcc_idx[s].size(),lt=bcc_idx[t].size();
for(int i=0;i<ls;i++){
bcc_vis[bcc_idx[s][i]]=1;
}
for(int i=0;i<lt;i++){
if(bcc_vis[bcc_idx[t][i]]){
cout<<"no"<<endl;
goto Cont;
}
}
for(int i=0;i<ls;i++){
bcc_vis[bcc_idx[s][i]]=0;
}
if(dis(s,m)+dis(m,t)!=dis(s,t)){
cout<<"no"<<endl;
continue;
}
cout<<"yes"<<endl;
Cont:;
}
return 0;
}
跑样例的时候是完全正确的,不仅答案正确,注释部分的日志输出也都对 可以自己试
求大佬帮忙调 awa