Question Link
题目意思
3 2 1
2 2 3
2 3 1
2 1 2
第一行
从点1 出发,接下来有两个点。2(直接到达)。3,要改变方向才能到。
所以意思就是 1->2 可以直接到达,1->3要改变方向才能到
第二行
从点2 出发,接下来有两个点。3(直接到达)。1,要改变方向才能到。
所以意思就是 2->3 可以直接到达,2->1要改变方向才能到
第三行
从点3 出发,接下来有两个点。1(直接到达)。2,要改变方向才能到。
所以意思就是 3->1 可以直接到达,3->2要改变方向才能到
AC code
Ford algorithm
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std;
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val) memset(var,val,sizeof(var))
#define LL long long
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x) rand()%(x)
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
while ( a>='0' && a<='9' ){ x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 210
int n,a,b,e[N][N];
int main(){
rep(i,1,N) rep(j,1,N) e[i][j] = 987987987;
rep(i,1,N) e[i][i] = 0;
scanf("%d%d%d",&n,&a,&b);
for (int i = 1; i <= n; i++ ){
int k,v;
scanf("%d",&k);
for (int j = 1; j <= k; j++){
scanf("%d",&v);
e[i][v] = j==1 ? 0:1;
}
}
rep(k,1,n) rep(i,1,n) rep(j,1,n) e[i][j] = min(e[i][j] , e[i][k] + e[k][j]);
if ( e[a][b] == 987987987 ) e[a][b] = -1;
printf("%d\n",e[a][b]);
return 0;
}