当前位置:   article > 正文

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛)(F题)(最短路)_gplt天梯赛真题

gplt天梯赛真题


 

G 国有 n 个城市,城市之间由 m 条双向直达铁路连接,一条铁路连接了两个不同的城市,并且乘坐第 iii 条铁路需要wi 个单位时间。如果两个城市之间没有直达的铁路,那么则必须要通过其他城市换乘才能相互可达。换乘不需要花费时间,但是 lbromine 非常不喜欢换乘。现在 lbromine 想要从 1 号城市到达 n 号城市,他想知道他最少需要经过多少个城市(包括城市 1和城市 n ),以及在保证经过城市最少的情况下需要花费的最少时间。

输入描述:

第一行两个正整数 n,m 表示 G国有 n 个城市和 m 条铁路。

接下来 m 行,每行三个整数 ui,vi,wi​ 表示 lbromine 可以花费 wi​ 的时间在 ui 和 vi​ 之间旅行。

数据保证 1 号城市和 n 号城市联通。

输出描述:

输出一行两个整数,第一个整数表示lbromine最少需要经过多少个城市,第二个整数表示保证经过城市最少的情况下需要花费的最少时间,两个整数之间用空格隔开。

示例1

输入

4 4
1 2 1
2 3 1
3 4 1
1 4 5

输出

2 5

备注:

对于 100% 的数据 1≤n≤100000 , n−1≤m≤200000, 1≤wi​≤10000

 

  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <cstring>
  5. using namespace std;
  6. const int MAXN = 100005;
  7. const int INF = 0x3f3f3f3f;
  8. int n,m;
  9. vector<pair<int,int>>adj[MAXN];
  10. bool visited[MAXN];
  11. int dist[MAXN];
  12. int cityNum[MAXN];
  13. struct Node{
  14. int id;
  15. int cityNum;
  16. int dist;
  17. bool operator < (const Node& other) const
  18. {
  19. if (cityNum != other.cityNum)
  20. {
  21. return cityNum > other.cityNum;
  22. }
  23. else
  24. return dist > other.dist;
  25. }
  26. };
  27. void dijkstra(){
  28. memset(visited , 0 , sizeof(visited));
  29. memset(dist , INF , sizeof(dist));
  30. memset(cityNum , INF , sizeof(cityNum));
  31. priority_queue<Node>pq;
  32. pq.push({1,1,0});
  33. dist[1] = 0;
  34. cityNum[1] = 1;
  35. while(!pq.empty()){
  36. int u=pq.top().id;
  37. pq.pop();
  38. if (visited[u]) continue;
  39. visited[u] = true;
  40. for(auto t:adj[u]){
  41. int v=t.first,w=t.second;
  42. if (cityNum[v] >= cityNum[u] + 1)
  43. {
  44. if (dist[v] > dist[u] + w)
  45. {
  46. dist[v] = dist[u] + w;
  47. cityNum[v] = cityNum[u] + 1;
  48. pq.push({ v, cityNum[v],dist[v]});
  49. }
  50. }
  51. }
  52. }
  53. cout << cityNum[n] << " " << dist[n] << endl;
  54. }
  55. int main(){
  56. scanf("%d%d",&n,&m);
  57. for(int i=1;i<=m;i++){
  58. int u,v,w;
  59. scanf("%d%d%d",&u,&v,&w);
  60. adj[u].push_back({v,w});
  61. adj[v].push_back({u,w});
  62. }
  63. dijkstra();
  64. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/796471
推荐阅读
  

闽ICP备14008679号