当前位置:   article > 正文

C++最短路径(迪杰斯特拉算法)_最短路径c++程序

最短路径c++程序

前言

Dijkstra算法能够有效地计算出源点到其余所有顶点的最短路径

该算法在运行过程中将顶点集合V分成两个集合S和T。

(1)S:已确定的顶点集合,初始只含源点s。

(2)T=V-S:尚未确定的顶点集合。

算法反复从T中选择当前到源点s最近的顶点u,将u加入集合S,然后对所有从u发出的边进行松弛操作。

 

【题目1:畅通工程续】

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

 

【输入】

第一行:N(0<N<200),M(0<M<1000),分别代表城镇数和已修道路数。

接下来M行,A,B,X,表示A—B(X)的双向道路。

再接下来的下一行:S(起点),T(终点)。

 

【输出】

输出最短需要行走的距离。若不存在则输出-1;

 

【样例输入】

  1. 3 3
  2. 0 1 1
  3. 0 2 3
  4. 1 2 1
  5. 0 2
  6. 3 1
  7. 0 1 1
  8. 1 2

【样例输出】

  1. 2
  2. -1

【代码】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<queue>
  6. #include<climits>
  7. using namespace std;
  8. const int MAXN=200;
  9. const int INF=INT_MAX;//无穷大设为很大的数
  10. struct Edge{
  11. int to;//终点
  12. int length;
  13. Edge(int t,int l){
  14. to=t;
  15. length=l;
  16. }
  17. };
  18. struct Point{
  19. int number;
  20. int distance;
  21. Point(int n,int d)
  22. {
  23. number=n;
  24. distance=d;
  25. }
  26. bool operator<(const Point&p)const{
  27. return distance>p.distance;//距离小的优先级高
  28. }
  29. };
  30. vector<Edge> graph[MAXN];//邻接表实现的图
  31. int dis[MAXN];//源点到各点距离
  32. void Dijkstra(int s){
  33. priority_queue<Point> myPriorityQueue;
  34. dis[s]=0;
  35. myPriorityQueue.push(Point(s,dis[s]));
  36. while(!myPriorityQueue.empty()){
  37. int u=myPriorityQueue.top().number;//离源点最近的点
  38. myPriorityQueue.pop();
  39. for(int i=0;i<graph[u].size();i++)
  40. {
  41. int v=graph[u][i].to;
  42. int d=graph[u][i].length;
  43. if(dis[v]>dis[u]+d){
  44. dis[v]=dis[u]+d;
  45. myPriorityQueue.push(Point(v,dis[v]));
  46. }
  47. }
  48. }
  49. }
  50. int main()
  51. {
  52. int n,m;
  53. while(cin>>n>>m)
  54. {
  55. memset(graph,0,sizeof(graph));//图初始化
  56. fill(dis,dis+n,INF);//距离初始化为无穷
  57. while(m--)
  58. {
  59. int from,to,length;
  60. cin>>from>>to>>length;
  61. graph[from].push_back(Edge(to,length));
  62. graph[to].push_back(Edge(from,length));
  63. }
  64. int s,t;
  65. cin>>s>>t;
  66. Dijkstra(s);
  67. if(dis[t]==INF)
  68. dis[t]=-1;
  69. cout<<dis[t]<<endl;
  70. }
  71. return 0;
  72. }

 

题目2:最短路径问题

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

 

输入描述:

  1. 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
  2. (1<n<=1000, 0<m<100000, s != t)

输出描述:

输出 一行有两个数, 最短距离及其花费。

示例1

输入

  1. 3 2
  2. 1 2 5 6
  3. 2 3 4 5
  4. 1 3
  5. 0 0

输出

9 11

注意

本题不仅需要求起点到终点的最短距离,还需要在有多条最短路径时,选取花费最少的那一条,只需更改Dijstra算法中的松弛操作:新的路径若在距离上优于之前的路径,或者新的路径在距离上等于之前的路径,但花费要优于之前的路径,则更新路径和花费。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<queue>
  6. #include<climits>
  7. using namespace std;
  8. const int MAXN=1001;
  9. const int INF=INT_MAX;
  10. struct Edge{
  11. int to;
  12. int length;
  13. int price;
  14. Edge(int t,int l,int p)
  15. {
  16. to=t;
  17. length=l;
  18. price=p;
  19. }
  20. };
  21. struct Point{
  22. int number;
  23. int distance;
  24. Point(int n,int d)
  25. {
  26. number=n;
  27. distance=d;
  28. }
  29. bool operator<(const Point& p)const{
  30. return distance>p.distance;//距离小的优先级高
  31. }
  32. };
  33. vector<Edge> graph[MAXN];
  34. int dis[MAXN];
  35. int cost[MAXN];
  36. void Dijkstra(int s)
  37. {
  38. priority_queue<Point> myPriorityQueue;
  39. dis[s]=0;
  40. cost[s]=0;
  41. myPriorityQueue.push(Point(s,dis[s]));
  42. while(!myPriorityQueue.empty())
  43. {
  44. int u=myPriorityQueue.top().number;
  45. myPriorityQueue.pop();
  46. for(int i=0;i<graph[u].size();i++)
  47. {
  48. int v=graph[u][i].to;
  49. int l=graph[u][i].length;
  50. int p=graph[u][i].price;
  51. if((dis[v]==dis[u]+l && cost[v]>cost[u]+p)||dis[v]>dis[u]+l)
  52. {
  53. dis[v]=dis[u]+l;
  54. cost[v]=cost[u]+p;
  55. myPriorityQueue.push(Point(v,dis[v]));
  56. }
  57. }
  58. }
  59. }
  60. int main()
  61. {
  62. int n,m;
  63. while(cin>>n>>m)
  64. {
  65. if(n==0&&m==0)
  66. break;
  67. memset(graph,0,sizeof(graph));
  68. fill(dis,dis+n+1,INF);
  69. fill(cost,cost+1,INF);
  70. while(m--)
  71. {
  72. int from,to,length,price;
  73. cin>>from>>to>>length>>price;
  74. graph[from].push_back(Edge(to,length,price));
  75. graph[to].push_back(Edge(from,length,price));
  76. }
  77. int s,t;
  78. cin>>s>>t;
  79. Dijkstra(s);
  80. cout<<dis[t]<<" "<<cost[t]<<endl;
  81. }
  82. return 0;
  83. }

 

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

闽ICP备14008679号