找割点,且去掉这个点后 S,T 两个点在2个块中
除了dfn[x]<=low[y] , 还有 dfn[y]<=dfn[T ]
#include <bits/stdc++.h>
using namespace std ;
const int N=2*1e5+1,M=5*1e5+1;
int nxt[M],head[N],go[M],all;
void add(int a,int b){
all++; nxt[all]=head[a]; go[all]=b;
head[a]=all;
}
int n,m,low[N],dfn[N],ans=1e8,pool,S,T;
void tar(int x) {
dfn[x]=low[x]=++pool;
int y,i;
for(i=head[x];i;i=nxt[i]){
y=go[i];
if(!dfn[y]){
tar(y),low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]&&
dfn[y]<=dfn[T]&&x!=S&&x!=T){
ans=min(ans,x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
int main(){
cin>>n;
int x,y;
while(cin>>x>>y,x&&y){
add(x,y);add(y,x);
}
cin>>S>>T;
tar(S);
if(ans==1e8) cout<<"No solution";else cout<<ans;
}
浙公网安备 33010602011771号