您的位置:首页 > 其它

Dijkstra — 最短路径算法

2015-07-26 14:43 513 查看
Dijkstra算法,狄克斯特拉算法,在有向图中搜索最短路径。

本文实现单个顶点到其余各个顶点之间的最短路径,与Prim算法有很多相似的地方。

算法实现的主要步骤:

(1) 初始化

所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;

(2)寻找最小值

从根结点开始,其依据:按照由近到远的次序求解

找到最小值后,更新lowcost[]

更新lowcost[]与Prim算法不同。

(3)重复第(2)步,直到所有点都被选中,则算法结束。

本文依据下图对算法实现:



具体代码如下,已经在vs2010测试通过

#include <iostream>
using namespace std;

#define DirectedGraphNode 8
#define INFINITE 1000

void Dijkstra(int directedGraph[][DirectedGraphNode], bool visited[], int lowcost[], int path[])
{
//初始化
memset(visited, 0, sizeof(bool) * DirectedGraphNode);
for(int i = 1; i < DirectedGraphNode; i++)
lowcost[i] = directedGraph[0][i];
visited[0] = true;
path[0] = 0;

int k = 0;
int min;
int minIndex;
for(int i = 1; i < DirectedGraphNode; i++ )//外循环,每次循环确定一个点
{
min = INFINITE;
//寻找最小值
for(int j = 1; j < DirectedGraphNode; j++)
{
if(false == visited[j] && lowcost[j] < min)
{
min = lowcost[j];
minIndex = j;
}
}
visited[minIndex] = true;//该点被访问
path[++k] = minIndex;

//更新lowcost[]
//lowcost[]为各个结点到根结点的最短距离,从根结点出发,依次到达各结点
for(int j = 1; j < DirectedGraphNode; j++)
{
if(false == visited[j] && lowcost[j] > lowcost[minIndex] + directedGraph[minIndex][j])
lowcost[j] = lowcost[minIndex] + directedGraph[minIndex][j];
}
}
}

void DijkstraRun()
{
//点与点之间存在边,权重为非零值,非无穷大值
//点与点之间不存在边,权重为无穷大值
int directedGraph[][DirectedGraphNode] =
{
{INFINITE, 30, 50, INFINITE, 10, INFINITE, INFINITE, INFINITE},
{INFINITE, INFINITE, 2, INFINITE, INFINITE, INFINITE, 6, INFINITE},
{INFINITE, INFINITE, INFINITE, 20, INFINITE, INFINITE, 3, INFINITE},
{INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE},
{20, 18, INFINITE, INFINITE, INFINITE, 7, INFINITE,  INFINITE},
{INFINITE, 8, INFINITE, INFINITE, INFINITE, INFINITE, 15, INFINITE},
{INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, 15},
{INFINITE, INFINITE, INFINITE, 12, INFINITE, INFINITE, INFINITE, INFINITE},
};

bool visited[DirectedGraphNode];
int path[DirectedGraphNode];
int lowcost[DirectedGraphNode];

Dijkstra(directedGraph, visited, lowcost, path);

cout<<"访问结点的顺序:"<<endl;
for(int i = 0; i < DirectedGraphNode; i++)
cout<<"v"<<path[i] + 1<<" ";//v1表示第一个结点
cout<<endl<<endl;

cout<<"各个结点到根结点的最短路径值:"<<endl;
for(int i = 1; i < DirectedGraphNode; i++)
cout<<lowcost[i]<<" ";
cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
DijkstraRun();
return 0;
}


算法运行结果如图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: