#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=0;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*10+num);
(flag)&&(res=-res);
#undef num
return res;
}
#define Nosolution ((n==19)?20:30)
const int N=1005;
int w[N][N];
inline void add(int u,int v){
w[u][++w[u][0]]=v;
w[v][++w[v][0]]=u;
}
int Brk[N],b[N],lca[N][N],d[N],vis[N],p[N],has[N];
int s,t,n,dep,now;
queue<int> q;
void spfa(int s){
memset(d,0x3f,sizeof(d));
d[s]=0,q.push(s),vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=1;i<=w[u][0];++i){
int v=w[u][i];
if(d[v]>d[u]+1){
d[v]=d[u]+1,p[v]=u;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
}
int cost=0;
bool dfs(int deep){
if(b[t]==2) return true;
if(deep+lca[now][t]+cost>dep) return false;
for(int i=1;i<=Brk[0];++i){
int u=Brk[i];
for(int j=1;j<=w[u][0];++j){
int v=w[u][j];
if(!b[v]){
Brk[i]=v;
if(u==now) now=v;
if(has[u]&&!has[v]&&b[u]!=2) --cost;
if(has[v]&&!has[u]&&b[u]!=2) ++cost;
swap(b[v],b[u]);
if(dfs(deep+1)) return true;
if(has[u]&&!has[v]&&b[v]!=2) ++cost;
if(has[v]&&!has[u]&&b[v]!=2) --cost;
if(now==v) now=u;
Brk[i]=u;
swap(b[v],b[u]);
}
}
}
return false;
}
int main(){
n=read(),s=read(),t=read();
now=s;
Brk[++Brk[0]]=s;
for(int i=0;i<n;++i){
b[i]=read()^1;
if(b[i]) Brk[++Brk[0]]=i;
int s,v;
s=read();
for(int j=0;j<s;++j){
v=read();
if(!lca[i][v]&&lca[v][i]){
add(i,v);
}
lca[i][v]=1;
}
}
b[s]=2;
for(int i=0;i<n;++i){
spfa(i);
for(int j=0;j<n;++j) lca[i][j]=d[j];
if(i==s){
int u=t;
while(u!=s){
has[u]=1;
if(b[u]==1) ++cost;
u=p[u];
}
has[s]=1;
}
}
for(dep=1;dep<=6;++dep)
if(dfs(0)) return printf("%d\n",dep),0;
printf("%d\n",Nosolution);
return 0;
}
他的 Nosolution 是 ((n==19)?20:30)。
建议撤下题解。