920. 最优乘车 单源最短路 stringstream

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值