评测记录
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1001000
long long n,a,b,dfn[N],low[N],num[N],chuo,w[N],cnt;
long long ver[N],Next[N],First[N],tot=-1;
inline long long read()
{
long long wjl=0,jia=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')jia*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
wjl=(wjl<<1)+(wjl<<3)+(ch^48);
ch=getchar();
}
return wjl*jia;
}
inline void add(long long x,long long y)
{
ver[++tot]=y;
Next[tot]=First[x];
First[x]=tot;
}
void Tarjan(long long x,long long fa)
{
dfn[x]=low[x]=++chuo;
long long flag=0;
for(long long i=First[x];~i;i=Next[i])
{
long long y=ver[i];
if(y==fa)continue;
if(!dfn[y])
{
Tarjan(y,x);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])flag++;
}
else low[x]=min(low[x],dfn[y]);
}
if(low[x]>=dfn[x])
{
for(long long i=First[x];~i;i=Next[i])
{
long long y=ver[i];
if(low[y]>=dfn[x])w[++cnt]=x;
}
}
}
int main ()
{
n=read();
memset(First,-1,sizeof(First));
while(1)
{
long long u=read(),v=read();
add(u,v);
add(v,u);
if(u==0&&v==0)break;
}
a=read(),b=read();
Tarjan(a,0);
sort(w+1,w+1+cnt);
for(long long i=1;i<=cnt;i++)
{
if(dfn[w[i]]<=dfn[b]&&w[i]!=b&&w[i]!=a)
{
printf("%lld\n",w[i]);
return 0;
}
}
printf("No solution\n");
return 0;
}