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,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
存储 算法 容器
【优选算法专栏】专题十六:BFS解决最短路问题(二)
【优选算法专栏】专题十六:BFS解决最短路问题(二)
28 1
|
29天前
|
算法
【优选算法专栏】专题十六:BFS解决最短路问题(一)
【优选算法专栏】专题十六:BFS解决最短路问题(一)
23 0
|
29天前
|
人工智能 算法 BI
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
【优选算法专栏】专题十八:BFS解决拓扑排序(一)
20 0
|
29天前
|
存储 算法
【优选算法专栏】专题十六:BFS解决最短路问题---前言
【优选算法专栏】专题十六:BFS解决最短路问题---前言
21 1
|
29天前
|
算法
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
22 1
|
4天前
|
算法 机器人 Python
Python实现教程:平面最短路径算法
Python实现教程:平面最短路径算法
12 1
|
12天前
|
网络协议 算法 数据库
【专栏】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法
【4月更文挑战第28天】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法。其特点是分层设计、快速收敛、高效资源利用和强故障恢复能力。在现代网络中,IS-IS广泛应用于服务提供商、企业网络及与其他协议的融合,是构建稳定、高效网络的关键。了解和应用IS-IS能提升网络系统的可靠性和效率。
|
13天前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)
|
13天前
|
人工智能 算法 BI
D - Silver Cow Party——POJ3268(连续用两次Dijkstra算法)
D - Silver Cow Party——POJ3268(连续用两次Dijkstra算法)
|
13天前
|
算法
最短路径的两大算法
最短路径的两大算法