1、算法原理
Dijkstra算法是经典的最短路径路由算法。
基本思想是,设置顶点集合S并不断地做贪心选择来扩充集合,直到扩展到终点为止。
2、算法实现过程
1、
3、C/C++代码实现
#include <iostream>
using namespace std;
#define MAX_DIST 10000000
#define MAX_VERTEX_NUM 50
typedef struct{
string vertex[MAX_VERTEX_NUM];
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num, edges_num;
}DJGraph;
void CreateDJ_Graph(DJGraph &gragh, int v, int e_value)
{
gragh.vertex_num=v;
gragh.edges_num=e_value;
for(int i=0;i<v;i++)
{
cin>>gragh.vertex[i];
}
for(int i=0;i<v;i++)
{
for(int j=0;j<v;j++)
{
gragh.edges[i][j]=MAX_DIST;
}
}
for(int i=0;i<e_value;i++)
{
int m,n,value;
cin>>m>>n>>value;
gragh.edges[m][n]=value;
}
}
void ShortestPath_DJ(DJGraph &graph, int start)
{
int final_minpath[MAX_VERTEX_NUM]; //标识对应顶点是否寻找了最短路径
int dist[MAX_VERTEX_NUM]; //记录start点到其它顶点的最短路径
string path[2*MAX_VERTEX_NUM];
for(int i=0;i<graph.vertex_num;i++)
{
dist[i]=graph.edges[start][i];
if(dist[i]<MAX_DIST)
{
path[i]=graph.vertex[start]+graph.vertex[i];
}
else{
path[i]="";
}
final_minpath[i]=0;
}
dist[start]=0;
final_minpath[start]=1;
int k = 0;
for(int i=1;i<graph.vertex_num;i++)
{
int min_dist = MAX_DIST;
for(int j=0;j<graph.vertex_num;j++)
{
if(dist[j]<min_dist&&final_minpath[j]==0)
{
min_dist=dist[j];
k=j;
}
}
final_minpath[k]=1;
for(int j=0;j<graph.vertex_num;j++)
{
if(dist[j]>dist[k]+graph.edges[k][j]&&final_minpath[j]==0)
{
dist[j]=dist[k]+graph.edges[k][j];
path[j]=path[k]+graph.vertex[j];
}
}
}
}
int main(int argc, char** argv)
{
DJGraph graph;
CreateDJ_Graph(graph, 7, 11);
ShortestPath_DJ(graph, 0);
system("pause");
return 0;
}
参考:
1. https://mayusheng.cn/2017/09/28/Dijkstra算法堆优化C++实现/
2. https://www.2cto.com/kf/201605/505625.html
3. http://www.cnblogs.com/skywang12345/p/3711514.html
4. http://blog.csdn.net/hackerain/article/details/6055925