求Hack
查看原帖
求Hack
134066
Pethly_Cat楼主2022/7/25 11:57

RT,和题解的做法都不太一样,自己觉得是对的,但交上去WA了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=1e6+5;
int n,m,s,t,p[N];
int dfn[N],low[N],num,cnt;
int h[N],ver[M],ne[M],tot=1;
bool bridge[M];
vector<int> ans,dcc[N];
queue<int> q;
unordered_map<int,bool> ok[N];
void add(int x,int y){
	ver[++tot]=y,ne[tot]=h[x],h[x]=tot;
}
void Tarjan(int x,int in_edge=0){
	dfn[x]=low[x]=++num;
	for(int i=h[x];i;i=ne[i]){
		int y=ver[i];
		if(!dfn[y]){
			Tarjan(y,i);
			low[x]=min(low[x],low[y]);
			if(dfn[x]<low[y]){
				bridge[i]=bridge[i^1]=true;
				ok[x][y]=ok[y][x]=true;
			}
		}
		else if(i!=(in_edge^1)) low[x]=min(low[x],dfn[y]);
	}
}
void bfs(int s){
	q.push(s);
	while(!q.empty()){
		int x=q.front(); q.pop();
		for(int i=h[x];i;i=ne[i]){
			int y=ver[i];
			if(p[y]||y==s) continue;
			p[y]=x;
			if(y==t) return;
			q.push(y);
		}
	}
}
int main(){
	scanf("%d",&n);
	while(true){
		int x,y; scanf("%d%d",&x,&y);
		if(x==0) break;
		if(x==y) continue;
		add(x,y); add(y,x);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i]) Tarjan(i,0);
	scanf("%d%d",&s,&t);
	bfs(s);
	int ed=t;
	while(ed!=s){
		if(ok[ed][p[ed]]){
			ans.push_back(ed);
			ans.push_back(p[ed]);
		}
		ed=p[ed];
	}
	int minn=2e9;
	for(int i=0;i<ans.size();i++)
		if(ans[i]!=s&&ans[i]!=t) minn=min(minn,ans[i]);
	minn==2e9? puts("No solution"):printf("%d",minn);
	return 0;
} 
2022/7/25 11:57
加载中...