超級水題,創建兩個圖就行,一個是火車的,一個是公交車的,而後跑兩遍floyed。c++
#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int N = 410; int a[N][N], b[N][N], n, m; void init() { for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(i != j) a[i][j] = b[i][j] = INF; } int main() { // freopen("in.txt", "r", stdin); int x, y; scanf("%d %d", &n, &m); init(); for(int i = 0; i < m; i++) { scanf("%d %d", &x, &y); a[x][y] = a[y][x] = 1; } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(a[i][j] == INF) b[i][j] = 1; for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(a[i][k] + a[k][j] < a[i][j]) a[i][j] = a[i][k] + a[k][j]; for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(b[i][k] + b[k][j] < b[i][j]) b[i][j] = b[i][k] + b[k][j]; if(a[1][n] == INF || b[1][n] == INF) puts("-1"); else printf("%d\n", max(a[1][n], b[1][n])); return 0; }