• 最优乘车——最短路


    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

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

    输出样例:
    2

    解析:

    可以把同一条巴士路线中的各个点连接,边权为1.

    如样例中第二条巴士路线 4 7 3 6 可以建立4-7,4-3,4-6,7-3,7-6,3-6等边,边权是1.

    每换一次车,就是换不同的巴士路线,距离就+1.

    不过,要注意读入的问题.

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    4. #define int long long
    5. typedef pair<int,int> PII;
    6. const int N=2e5+10;
    7. struct node
    8. {
    9. int v,w;
    10. };
    11. vector <node> g[N];
    12. int n,m;
    13. vector <int> a;
    14. void find(string s)
    15. {
    16. for (int i=0;i<s.size();i++)
    17. {
    18. int j=i;
    19. while (j<s.size()&&s[j]!=' ') j++;
    20. string p=s.substr(i,j-i);
    21. int x=0,cnt=1;
    22. for (int k=p.size()-1;k>=0;k--)
    23. {
    24. x +=(p[k]-'0')*cnt;
    25. cnt *=10;
    26. }
    27. a.push_back(x);
    28. i=j;
    29. }
    30. }
    31. int d[N];
    32. bool vis[N];
    33. void dijkstra()
    34. {
    35. memset(d,0x3f,sizeof d);
    36. priority_queue <PII,vector<PII>,greater<PII>> q;
    37. d[1]=0;
    38. q.push({0,1});
    39. while (q.size())
    40. {
    41. int tance=q.top().first;
    42. int u=q.top().second;
    43. q.pop();
    44. if (vis[u]) continue;
    45. vis[u]=1;
    46. for (auto x:g[u])
    47. {
    48. int v=x.v,w=x.w;
    49. if (d[v]>tance+w)
    50. {
    51. d[v]=tance+w;
    52. q.push({d[v],v});
    53. }
    54. }
    55. }
    56. }
    57. signed main()
    58. {
    59. ios;
    60. cin>>m>>n;
    61. cin.ignore();
    62. while (m--)
    63. {
    64. string s;
    65. getline(cin,s);
    66. a.clear();
    67. find(s);
    68. for (int i=0;i<a.size();i++)
    69. for (int j=i+1;j<a.size();j++)
    70. {
    71. g[a[i]].push_back({a[j],1});
    72. }
    73. }
    74. dijkstra();
    75. if (d[n]>0x3f3f3f3f/2) cout<<"NO";
    76. else cout<<d[n]-1;
    77. return 0;
    78. }

  • 相关阅读:
    LCD12864驱动开发
    python过滤非法字符
    Springboot美发店会员管理系统y71a1计算机毕业设计-课程设计-期末作业-毕设程序代做
    PaddleOCR-EAST
    ObjectMapper
    SpringMVC基础篇(二)
    维修电工实训装置
    增强现实(AR)开发框架
    8月最新修正版风车IM即时聊天通讯源码+搭建教程
    如何获取springboot中所有的bean
  • 原文地址:https://blog.csdn.net/m0_74403543/article/details/134427727