C++实现一个简单的Dijstra算法
Posted Jing Sir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现一个简单的Dijstra算法相关的知识,希望对你有一定的参考价值。
如下所示,这是一个简单的迪杰斯特拉:
void Dijstra(Graph<EdgeType> &G,int s,EdgeType D[],int Path[])
{
int n=G.VerticesNum();
int i,j;
for(i=0;i<n;i++)
{
G.Mark[i]=UNVISITED;
D[i]=INFINITY;
Path[i]=-1; //标记此时不存在s到i的路径
}
G.Mark[s]=VISITED;
D[s]=0;
Path[s]=s;
for(i=0;i<n;i++)
{
//找到一条最短特殊路径,即min{D[j]|G.Mark[j]==UNVISITED,0<=j<n}
EdgeType min=D[0];
int k=0;
for(j=1;j<n;j++)
{
if(G.Mark[j]==UNVISITED&&min>D[j])
{
min=D[j];
k=j;
}
}
//已经确定s到k的最短路径
G.Mark[k]=VISITED;
//利用k更新到其余未访问顶点的最短特殊路径
for(Edge<EdgeType> e=G.FirstEdge(k);G.IsEdge(e);e=G.NextEdge(e))
{
int endVertex=e.end;
if(G.Mark[endVertex]==UNVISITED&&D[endVertex]>(D[k]+e.weight))
{
//更新到endVertex的最短特殊路径
D[endVertex]=D[k]+e.weight;
Path[endVertex]=k;
}
}
}
}
以上是关于C++实现一个简单的Dijstra算法的主要内容,如果未能解决你的问题,请参考以下文章
图论中的重要算法(Dijstra,Bellman-Ford,Floyd,Ford-Fulkerson,匈牙利算法)的详细解读及实现