Dijkstra算法求单源最短路径(二)(BFS的改版)

简介:

1.解析

该算法其实就是广度优先算法的改版,只是将广度优先算法中的普通队列改为了这里的优先队列。

2.算法实例

[c-sharp] view plain copy print ?
  1. #include<iostream>      
  2. #include<malloc.h>      
  3. #include<queue>    
  4. #include <algorithm>     
  5. #include<stdlib.h>    
  6. #include<functional>  
  7. using namespace std;      
  8.    
  9. #define maxNum 100 //定义邻接举证的最大定点数    
  10. #define maxWeight 1000000 //边权最大值    
  11. //顶点信息  
  12. typedef struct  
  13. {  
  14.     int id;  
  15.     int dist;  
  16. }node;  
  17. //图的邻接矩阵表示结构      
  18. typedef struct      
  19. {      
  20.     //char v[maxNum];//图的顶点信息   
  21.     node v[maxNum];  
  22.     int e[maxNum][maxNum];//图的顶点信息      
  23.     int vNum;//顶点个数      
  24.     int eNum;//边的个数      
  25. }graph;  
  26. //函数声明    
  27. void createGraph(graph *g);//创建图g   
  28. int cmp(node a,node b);//定义优先队列以升序还是降序排列  
  29. void Dijkstra(graph *g);//核心算法,是BFS的改版,只是将普通队列改成了优先队列。  
  30. //定义排序类型。以node中dist升序排列  
  31. int cmp(node a,node b)       
  32. {       
  33.     return a.dist<b.dist;//  升序     
  34. }    
  35. //Dijkstra算法  
  36. void Dijkstra(graph *g)    
  37. {    
  38.     node Q[maxNum]; //定义结构体数组  
  39.     int front;//队列头    
  40.     int rear;//队列尾    
  41.     int count;//队列计数   
  42.     front=rear=count=0;//表示队列为空  
  43.     int k,i,j;    
  44.     //初始化dist的值  
  45.     for(i=1;i<=g->vNum;i++)    
  46.     {  
  47.         g->v[i].dist=maxWeight;  //dist为最大值  
  48.         g->v[i].id=i;  
  49.     }  
  50.     g->v[1].dist=0;//1作为源点,dist为0  
  51.     //以下两行是元素进队列操作  
  52.     Q[++rear]=g->v[1];  
  53.     count++;//顶点进入队列Q  
  54.     while(count>0)    
  55.     {   
  56.         sort(Q+front+1,Q+rear+1,cmp);//对队列Q进行排序,按dist的降序排列。  
  57.         //以下两行是队列的出队操作  
  58.         node n1=Q[++front];  
  59.         count--;//出队列操作  
  60.         k=n1.id;//优先队列中会取出队列中最小值就是最短路径    
  61.         for(j=1;j<=g->vNum;j++)    
  62.         {    
  63.             if(g->e[k][j]!=maxWeight)//k->j之间有边    
  64.             {    
  65.                 if(g->v[j].dist>(g->v[k].dist+g->e[k][j]))    
  66.                 {  
  67.                     g->v[j].dist=g->v[k].dist+g->e[k][j];  
  68.                     Q[++rear]=g->v[j];  
  69.                     count++;  
  70.                 }  
  71.             }    
  72.         }    
  73.     }    
  74. }    
  75. void createGraph(graph *g)//创建图g      
  76. {      
  77.     cout<<"正在创建无向图..."<<endl;      
  78.     cout<<"请输入顶点个数vNum:";      
  79.     cin>>g->vNum;       
  80.     int i,j;    
  81.     //构造邻接矩阵,顶点到自身的距离是无穷大的。    
  82.     cout<<"输入邻接矩阵权值:"<<endl;   
  83.     for(i=1;i<=g->vNum;i++)  
  84.         for(j=1;j<=g->vNum;j++)  
  85.         {  
  86.             cin>>g->e[i][j];  
  87.             if(g->e[i][j]==0)  
  88.                 g->e[i][j]=maxWeight;  
  89.         }  
  90. }      
  91.       
  92. int main()      
  93. {      
  94.     graph *g;      
  95.     g=(graph*)malloc(sizeof(graph));      
  96.     createGraph(g);      
  97.     Dijkstra(g);   
  98.     cout<<"Dijkstra算法单源(源为1)最短路径为:"<<endl;  
  99.     for(int k=1; k<=g->vNum; k++)  
  100.     {  
  101.         cout<<g->v[k].dist<<" ";  
  102.     }  
  103.     cout<<endl;  
  104.     system("pause");    
  105.     return 0;      
  106. }      
  107. /* 
  108. 正在创建无向图... 
  109. 请输入顶点个数vNum:5 
  110. 输入邻接矩阵权值: 
  111. 0 4 2 0 0 
  112. 0 0 3 2 3 
  113. 0 1 0 4 5 
  114. 0 0 0 0 0 
  115. 0 0 0 1 0 
  116. Dijkstra算法单源(源为1)最短路径为: 
  117. 0 3 2 5 6 
  118. 请按任意键继续. . . 
  119. */  



本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/06/14/2297003.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
1月前
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)
|
3月前
|
存储 算法
BFS算法的实现
BFS算法的实现
49 1
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
58 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
4月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
60 3
|
3月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
78 0
|
3月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
66 0
|
4月前
|
算法 Java C++
《经典图论算法》迪杰斯特拉算法(Dijkstra)
这个是求最短路径的迪杰斯特拉算法,另外我还写了50多种《经典图论算法》,每种都使用C++和Java两种语言实现,熟练掌握之后无论是参加蓝桥杯,信奥赛,还是其他比赛,或者是面试,都能轻松应对。