poj 1847 Tram
http://poj.org/problem?id=1847
这道题题意不太容易理解,n个车站,起点a,终点b;问从起点到终点需要转换开关的最少次数
开始的那个点不需要转换开关
数据:
3 2 1//第一个数车站总数3,第二个数起点2,第三个数终点1 2 2 3//第一个数有2个点可到达,两个点分别是2(不需要转换开关),3(需要转换开关) 2 3 1 2 1 2
可转化为最短路来写,转换开关次数当做最短路径
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<queue> #define INF 0x3f3f3f3f #define max(a, b)(a > b ? a : b) #define min(a, b)(a < b ? a : b) #define N 110 int G[N][N], n; void Floyd() { int i, j, k; for(k = 1 ; k <= n ; k++) { for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) if(G[i][k] + G[k][j] < G[i][j]) G[i][j] = G[i][k] + G[k][j]; } } } int main() { int i, j, a, b, m, x; while(scanf("%d%d%d", &n, &a, &b) != EOF) { for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) { if(i == j) G[i][j] = 0; G[i][j] = INF; } } for(i = 1 ; i <= n ; i++) { scanf("%d", &m); int f = 1; while(m--) { scanf("%d", &x); if(f == 1) { G[i][x] = 0; f = 0; } else G[i][x] = 1; } } Floyd(); if(G[a][b] == INF) printf("-1\n"); else printf("%d\n", G[a][b]); } return 0; }