样例过但全WA求助
查看原帖
样例过但全WA求助
479807
ShenTianYi_楼主2024/1/3 14:37
#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;
}

评测全WA记录

跑样例的时候是完全正确的,不仅答案正确,注释部分的日志输出也都对 可以自己试

求大佬帮忙调 awa

2024/1/3 14:37
加载中...