稍微包装过一下的最短路。
如果初始状态就是到达那个路口,就把权值搞为0,如果不是就搞为1;
然后跑最短路,我用的是SPFA,不过100的数据怎么跑都行吧。。
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=100;
int n,a,b,k,map[maxn+1][maxn+1],que[100*maxn+1],head=1,tail=1,dis[maxn+1],top;
bool flag[maxn+1];
void read()
{
int i,j,l;
std::ios::sync_with_stdio(false);
memset(map,0x3f,sizeof(map));
memset(dis,0x3f,sizeof(dis));
cin>>n>>a>>b;
for(i=1; i<=n; i++)
{
cin>>k;
for(j=1; j<=k; j++)
{
cin>>l;
if(j==1)
map[i][l]=0;
else
map[i][l]=1;
}
}
dis[a]=0;
que[tail++]=a;
while(head!=tail)
{
top=que[head++];
flag[top]=false;
for(i=1; i<=n; i++)
if(dis[i]>dis[top]+map[top][i])
{
dis[i]=dis[top]+map[top][i];
if(flag[i]!=true)
{
flag[i]=true;
que[tail++]=i;
}
}
}
if(dis[b]>1000000)
cout<<-1;
else
cout<<dis[b];
return;
}
int main()
{
read();
return 0;
}
AC。