求调,不知道subtask是什么魔法数据
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define mp make_pair
#define int long long
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
#define maxn 200010
#define int long long
int idx;
int p,q;
vector<int> vec[maxn*3];
int dfn[maxn],low[maxn];
int cut[maxn];
int n,m;
int flag=0;
int ans=1e9;
bool check(int u,int v)
{
if(dfn[v]<=dfn[p]&&dfn[v]>dfn[q])
{
return 1;
}
if(dfn[v]<=dfn[q]&&dfn[v]>dfn[p])
{
return 1;
}
return 0;
}
inline void tarjan(int now,int root,int fa)
{
dfn[now]=low[now]=++idx;
int child=0;
for(int i=0;i<vec[now].size();i++)
{
int to=vec[now][i];
if(!dfn[to])
{
child++;
tarjan(to,root,now);
low[now]=min(low[to],low[now]);
if(low[to]>=dfn[now]&&now!=q&&check(now,to))
{
ans=min(ans,now);
}
}
else if(to!=fa) low[now]=min(low[now],dfn[to]);
}
if(child>=2&&now==root) cut[now]=1,flag=1;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
while(1){
int a,b;
cin>>a>>b;
if(!a&&!b) break;
vec[a].push_back(b);
vec[b].push_back(a);
}
int cnt=0;
// for(int i=1;i<=n;i++){
// if(cut[i])
// {
// cnt++;
// }
// }
// cout<<cnt<<endl;
cin>>p>>q;
tarjan(1,1,-1);
if(ans==1e9)
{
cout<<"No solution"<<endl;
}
else
{
cout<<ans<<endl;
}
return 0;
}