标签:
Description:
Input:
Output:
Sample Input:
3 2 1 2 2 3 2 3 1 2 1 2
Sample Output:
0
题意:有n个十字路口,每个十字路口有连着不同的轨道进入不同的十字路口,每个十字路口只有一个与之直接相连的路口,如果想要到其他路口去就必须手动控制,那么从路口A到路口B最少需要几次手动控制开关。先看一下输入,先输入n A B,这个不需要多解释,接下来n行,每行先输入一个x表示与路口i相连的路口有多少个,接下来x个数,表示与路口i相连的路口的编号y,值得注意的是输入的第一个y是本来就与路口i直接相连的,那么此时的G[i][y]=0,其他的y则需要手动控制了,那么此时的G[i][y]=1,感觉输入说完就不用再解释了,代码呼之欲出,直接用Floyd算法模板即可。
那就直接贴上代码了。。。
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; const int N=110; const int INF=0x3f3f3f3f; int G[N][N], n; void Init() { int i, j; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) G[i][j] = INF; G[i][i] = 0; } } void Dist() { int i, j, k; for (k = 1; k <= n; k++) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) G[i][j] = min(G[i][j], G[i][k]+G[k][j]); } } } int main () { int A, B, i, j, x, y; while (scanf("%d%d%d", &n, &A, &B) != EOF) { Init(); for (i = 1; i <= n; i++) { scanf("%d", &x); for (j = 1; j <= x; j++) { scanf("%d", &y); if (j == 1) G[i][y] = 0; else G[i][y] = 1; } } Dist(); if (G[A][B] == INF) printf("-1\n"); else printf("%d\n", G[A][B]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4818886.html