传送门
方法一:
以i为起点dfs,对于每一个节点p维护一个bj[p]表示在以p为根的子树中有无j节点;
进行一次最最最最最最最最普通的tarjan找割点;
如果某点是割点而且子树中有j点,就是符合条件的点。
方法二:
见代码哦~
主要看一下ans++的条件!
#include<bits/stdc++.h>
using namespace std;
const int INF=2000000000;
int ans=2000000000,sp1,sp2,n,head[101],dfn[101],low[101],tot=0,cnt=0,top=0;
bool cut[101];//1 double e 2 judge 3 the rt
struct node
{
int u,v,nxt;
}a[10001];
void add(int x,int y)
{
tot++;
a[tot].u=x;
a[tot].v=y;
a[tot].nxt=head[x];
head[x]=tot;
}
void tar(int x)
{
cnt++;
dfn[x]=cnt;
low[x]=dfn[x];
for(int i=head[x];i;i=a[i].nxt)
{
int now=a[i].v;
if(dfn[now]==0)//
{
tar(now);
low[x]=min(low[x],low[now]);
if(x!=sp1&&x!=sp2&&dfn[x]<=low[now]&&dfn[now]<=dfn[sp2]&&dfn[sp1]<=low[sp2])
ans=min(ans,x);
}
else
{
low[x]=min(low[x],dfn[now]);
}
}
}
int main()
{
scanf("%d",&n);
int u,v;
while(scanf("%d%d",&u,&v)&&u)
{
add(u,v);
add(v,u);
}
scanf("%d%d",&sp1,&sp2);
tar(sp1);
if(ans!=INF) printf("%d",ans);
else printf("No solution");
}