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;
}