迪杰斯特拉(Dijkstra)算法求到各顶点的最短路径
#include<iostream>
#include<stdlib.h>
#define MAXINT 100000000
using namespace std;
void ShortestPath_Dijkstra(int **G, int n, int v)
{
if ( v >= n ) return;
bool S[n]; //标记顶点i是否求从源点到顶点的最短路径
int path[n]; //保存从源点v到顶点i的前驱
int D[n]; //保存当前各顶点到源点的最短路径长度
/******************初始化*********************/
for(int i=0; i < n; i++)
{
S[i] = false;
int d = *((int*) G+v*n+i );
if ( d < MAXINT)
{
path[i] = v;
D[i] = d;
}else
{
D[i] = MAXINT;
path[i] = -1;
}
}
S[v] = true;
D[v] = 0;
/**********************初始化完成**********************/
for( int i = 1; i < n; i++ )
{
int min = MAXINT;
int vk;
// 找出最短路径的一个顶点标记为true
for (int j = 0; j < n; j++ )
{
if ( !S[j] && D[j] < min )
{
min = D[j];
vk = j;
}
}
S[vk] = true;
//更新未求出最短路径的顶点的路径长度(新最短路径顶点被找到)
for (int j = 0; j < n; j++ )
{
// <v,vk>+<vk,j> < D[j]
if ( !S[j] && ( D[vk] + *((int*) G+vk*n+j )) < D[j] )
{
D[j] = D[vk] + *((int*) G+vk*n+j ); //更新距离
path[j] = vk; //更新前驱
}
}
}
for (int i = 0; i < n; i++ )
cout<<D[i] << " " ;
cout<<endl;
for (int i=0; i < n; i++ )
cout<< path[i]<<"->"<<i<<endl;
}
int main(void)
{
//邻接矩阵
int graph[6][6] =
{
{ MAXINT, MAXINT, 10, MAXINT, 30, 100 },
{ MAXINT, MAXINT, 5, MAXINT, MAXINT, MAXINT },
{ MAXINT, MAXINT, MAXINT, 50, MAXINT, MAXINT },
{ MAXINT, MAXINT, MAXINT, MAXINT, MAXINT, 10 },
{ MAXINT, MAXINT, MAXINT, 20, MAXINT, 60 },
{ MAXINT, MAXINT, MAXINT, MAXINT, MAXINT, MAXINT }
};
ShortestPath_Dijkstra((int **)graph, 6, 0);
return 0;
}