题目:https://www.luogu.org/problemnew/show/P1346
分析:将默认通向的边权设为0,手动通向的边权设为1,就成了最短路问题。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,x,y,m,a,f[101][101];
int main(){
cin>>n>>x>>y;
memset(f,0x0f,sizeof(f));
for(int i=1;i<=n;i++){
cin>>m;
for(int j=1;j<=m;j++){
cin>>a;
if(j==1)f[i][a]=0;
else f[i][a]=1;
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=k && j!=k && i!=j
&& f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];
if(f[x][y]!=0x0f0f0f0f)cout<<f[x][y];
else cout<<-1;
return 0;
}