建图:
对于每条公交线路,从每个站到它后面站建一条权值为 1 的有向边,代表花费为 1 (上一次车)
最终求 1 到 n 的最短路,即最少花费,再减一即最少换乘次数。
#include<iostream>
#include<cstring>
#include<sstream>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int n, m;
int dist[N], g[N][N];
bool st[N];
void bfs(){
int q[N], hh = 0, tt = 0;
memset(dist, 0x3f, sizeof dist);
q[0] = 1;
dist[1] = 0;
while (hh <= tt) {
int t = q[hh ++ ];
for (int i = 1; i <= n; i ++ ){
if (g[t][i] != INF && !st[i]) {
dist[i] = dist[t] + 1;
q[++ tt] = i;
st[i] = true;
if (i == n) return ;
}
}
}
}
int main(void) {
cin >> m >> n;
string line;
int stop[N];
getline(cin, line);
memset(g, 0x3f, sizeof g);
while (m -- ) {
getline(cin, line);
stringstream ssin(line);
int cnt = 0, p;
while (ssin >> p) stop[cnt ++ ] = p;
for (int i = 0; i < cnt; i ++ )
for (int j = i + 1; j < cnt; j ++ )
g[stop[i]][stop[j]] = 1;
}
bfs();
if (dist[n] == INF) cout << "NO" << endl;
else cout << max(dist[n] - 1, 0) << endl;
return 0;
}