• 【算法】最优乘车——bfs(stringsteam的实际应用,getline实际应用)


    题目

    H 城是一个旅游胜地,每年都有成千上万的人前来观光。

    为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴士线路

    每条单程巴士线路从某个巴士站出发,依次途经若干个巴士站,最终到达终点巴士站。

    一名旅客最近到 H 城旅游,他很想去 S 公园游玩,但如果从他所在的饭店没有一路巴士可以直接到达 S 公园,则他可能要先乘某一路巴士坐几站,再下来换乘同一站台的另一路巴士,这样换乘几次后到达 S 公园。

    现在用整数 1,2,…N 给 H 城的所有的巴士站编号,约定这名旅客所在饭店的巴士站编号为 1,S 公园巴士站的编号为 N。

    写一个程序,帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到 S 公园的过程中换乘的次数最少。

    输入格式

    第一行有两个数字 M 和 N,表示开通了 M 条单程巴士线路,总共有 N 个车站。

    从第二行到第 M+1 行依次给出了第 1 条到第 M 条巴士线路的信息,其中第 i+1 行给出的是第 i 条巴士线路的信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。

    输出格式

    共一行,如果无法乘巴士从饭店到达 S 公园,则输出 NO,否则输出最少换乘次数,换乘次数为 0 表示不需换车即可到达。

    数据范围

    1 ≤ M ≤ 100
    2 ≤ N ≤ 500

    输入样例:
    1. 3 7
    2. 6 7
    3. 4 7 3 6
    4. 2 1 3 5
    输出样例:
    2
    

    思路

            假设一条公交路线为1 -> 2 -> 3 -> 4则,从1号点乘车可以到达2,3,4,从2号点出发可以到3,4,从3号点出发可以到4。

            我们可以建立单向边1 -> 2,1 -> 3,1 -> 4,2 -> 3,2 -> 4,3 -> 4,然后进行宽度搜索就可以得到换成最少次数。

            本题难点在于输入,具体输入方法见代码。

    代码

    1. #include
    2. using namespace std;
    3. const int N = 1010;
    4. int m,n;
    5. int stop[N];
    6. bool g[N][N];
    7. int dist[N];
    8. bool st[N];
    9. void bfs()
    10. {
    11. memset(dist,0x3f3f3f3f,sizeof(dist));
    12. dist[1] = 0;
    13. queue<int> heap;
    14. heap.push(1);
    15. while(!heap.empty())
    16. {
    17. int t = heap.front();
    18. heap.pop();
    19. for(int i = 1; i <= n; i ++)
    20. {
    21. if(g[t][i] && dist[i] > dist[t] + 1)
    22. {
    23. dist[i] = dist[t] + 1;
    24. heap.push(i);
    25. }
    26. }
    27. }
    28. }
    29. int main()
    30. {
    31. cin >> m >> n;
    32. string line;
    33. getline(cin,line);
    34. while(m --)
    35. {
    36. getline(cin,line);
    37. stringstream ssin(line);
    38. int cnt = 0,p;
    39. while(ssin >> p) stop[cnt ++] = p;
    40. for(int i = 0; i < cnt; i ++)
    41. for(int j = i + 1; j < cnt; j ++)
    42. g[stop[i]][stop[j]] = true;
    43. }
    44. bfs();
    45. if(dist[n] == 0x3f3f3f3f) cout << "NO" << endl;
    46. else cout << max(dist[n] - 1,0) << endl;
    47. return 0;
    48. }

    标签

    难度:中等
    时/空限制:1s / 64MB
    来源:NOI1997
    算法标签:单源最短路
  • 相关阅读:
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    PreScan快速入门到精通第三十讲基于PreScan进行摄像头传感器仿真
    [架构之路-241]:目标系统 - 纵向分层 - 企业信息化与企业信息系统(多台企业应用单机组成的企业信息网络)
    Android Studio的笔记--随机数
    SIP系统组成格式
    完整数字华容道03:首页创建
    UTF-8和UTF-16扩展方案
    dfs之字符串拼接
    nodejs--开发自己的项目——5.2——个人中心模块——重置密码——设置的url:/my/updatepwd——post请求
    java(类加载)
  • 原文地址:https://blog.csdn.net/littlegengjie/article/details/134220103