#include <iostream>
#include <queue>
#include <cstring>
#include <sstream>
using namespace std;
const int N = 510,INF = 0x3f3f3f3f;
int m,n;
string line; // 用于存储输入的每一行数据
bool g[N][N]; // g[i][j]表示从车站i到车站j是否有直达巴士线路
int stop[N]; // stop[i]表示第i条巴士线路上的所有站号
int dist[N]; // dist[i]表示从饭店到车站i的最少换乘次数
int bfs () { // 使用广度优先搜索算法求解最少换乘次数
queue <int> q;
q.push (1); // 将饭店的车站编号1加入队列
memset (dist,0x3f,sizeof (dist)); // 初始化dist数组,将所有元素设置为无穷大
dist[1] = 0; // 将饭店的最少换乘次数设为0
while (!q.empty ()) { // 当队列不为空时,继续处理
int t = q.front (); // 取出队列中的第一个元素t
q.pop (); // 将t从队列中移除
for (int i = 1;i <= n;i++) { // 遍历所有车站
if (g[t][i] && dist[i] > dist[t]+1) { // 如果从t可以到达i,并且从饭店到i的换乘次数大于从饭店到t的换乘次数+1
dist[i] = dist[t]+1; // 更新从饭店到i的最少换乘次数
q.push (i); // 将i加入队列,等待处理
}
}
}
return dist[n]; // 返回从饭店到终点S公园的最少换乘次数
}
int main () {
cin >> m >> n; // 输入开通了的单程巴士线路数量和总共有n个车站
getline (cin,line); // 读取并忽略一行多余的换行符
while (m--) { // 循环处理每一条单程巴士线路的信息
getline (cin,line); // 读取一行数据,即一条单程巴士线路的信息
stringstream ss (line); // 创建一个字符串流对象ss,用于处理这一行数据
int p,cnt = 0; // p表示当前读取到的站号,cnt表示当前这条单程巴士线路上的站数
while (ss >> p) stop[++cnt] = p; // 循环读取这一行数据中的每个站号,并将其存入stop数组中
for (int i = 1;i <= cnt;i++) { // 遍历这一行数据中的每个站号
for (int j = i+1;j <= cnt;j++) { // 遍历这一行数据中的每个站号
g[stop[i]][stop[j]] = 1; // 标记从stop[i]到stop[j]有一条直达巴士线路
}
}
}
int ans = bfs (); // 调用bfs函数求解最少换乘次数
if (ans == INF) puts ("NO"); // 如果无法到达S公园,输出"NO"
else cout << max (ans-1,0) << endl; // 否则输出最少换乘次数减1(因为从饭店到S公园也算一次换乘),如果结果小于0,则输出0
return 0;
}
920. 最优乘车 单源最短路 stringstream
最新推荐文章于 2024-07-25 11:44:32 发布