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

 

posted on 2022-11-26 18:15  towboat  阅读(100)  评论(0)    收藏  举报