// DijkstraSearch.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define INFINITY 1000
void DijkstraSearch(int** disMat, int nodeNbr, int beginPos, int* &disVct){
int* isSelected=new int[nodeNbr];
for (int i=0;i<nodeNbr;i++)
{
disVct[i]=INFINITY;
isSelected[i]=0;
}
for (int i=0; i<nodeNbr;i++)
{
disVct[i]=disMat[beginPos][i];
}
for (int k=0;k<nodeNbr;k++)
{
int minDis=INFINITY;
int minPos=-1;
for (int i=0;i<nodeNbr;i++)
{
if (disVct[i]<minDis&&0==isSelected[i])
{
minDis=disVct[i];
minPos=i;
}
}
isSelected[minPos]=1;
for (int j=0;j<nodeNbr;j++)
{
if (0==isSelected[j])
{
int newDis=disVct[minPos]+disMat[minPos][j];
disVct[j]=disVct[j]<newDis? disVct[j]:newDis;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int disMat[6][6]={
{0,1,2, INFINITY,INFINITY,INFINITY},
{INFINITY,0,3,4,INFINITY,INFINITY},
{INFINITY,INFINITY,0,INFINITY,5,6},
{INFINITY,INFINITY,INFINITY,0,INFINITY,7},
{INFINITY,INFINITY,INFINITY,INFINITY,0,8},
{INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,0}
};
int nodeNbr=6;
int** pDisMat=new int*[nodeNbr];
for (int i=0;i<nodeNbr;i++)
{
pDisMat[i]=new int[nodeNbr];
}
for (int i=0;i<nodeNbr;i++)
{
for (int j=0;j<nodeNbr;j++)
{
pDisMat[i][j]=disMat[i][j];
}
}
int* pDisVct=new int[nodeNbr];
DijkstraSearch(pDisMat,nodeNbr,0,pDisVct);
for (int i=0;i<nodeNbr;i++)
{
printf("%d ", pDisVct[i]);
}
printf("\n");
return 0;
}
致敬:EW Dijkstra, A note ontwo problems in connexion with graphs, Numerische mathematik, 1, 269-271,1959
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
以上文字网易用户绿岩:http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/
Dijkstra核心部分:
D(v)=min{D(v), D(w)+c(w,v)}
Dijkstra算法伪代码:
Initiallization:
N’={u}
For all nodes v
If v is a neighbor of u
Then D(v)=c(u,v)
Else
D(v)=infinite
Loop
Find w not in N’ such that D(w) is a minimum
Add w to N’
Update D(v)=min{D(v), D(w)+c(w,v)}
Until N’=N
以上文字出自出版物《Computer Network-A top-down approach》
C++代码如下:
以下实例出自http://www.wutianqi.com/?p=1890
![](https://img-my.csdn.net/uploads/201301/18/1358467152_6607.jpg)
Times | S | U | DIST[2] | DIST[3] | DIST[4] | DIST[5] |
1 | 1 | none | 10 | Infinite | 30 | 100 |
2 | 1,2 | 2 | 10 | 60 | 30 | 100 |
3 | 1,2,4 | 4 | 10 | 50 | 30 | 90 |
4 | 1,2,4,3 | 3 | 10 | 50 | 30 | 60 |
5 | 1,2,4,3,5 | 5 | 10 | 50 | 30 | 60 |