找割点,且去掉这个点后 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; }