#include <iostream>
using namespace std;
#define MAX 1000000
int c[100][100];
void dijkstra(int n,int v,int d[],int pre[])
{
bool s[100]; //记录该节点是否被访问过
for(int i=1;i<=n;i++) //执行一些初始化的工作
{
s[i]=false;
d[i]=c[v][i];
if(d[i]==MAX){
pre[i] = 0;
}
else{
pre[i]= v;
}
}
d[v]=0;
s[v]=true;
for (i=1;i<n;i++)
{
int tmp=MAX;
int u=v;
for(int j=1;j<=n;j++) //找到u,其中是与v相邻且路径值最小的。
{
if(!s[j]&&(d[j]<tmp)){
tmp = d[j];
u=j;
}
}
s[u]=true;
for(j=1;j<=n;j++) //执行更新操作
{
if(!s[j]&&(c[u][j]<MAX))
{
int newd = c[u][j] + d[u];
if(newd<d[j]){
d[j] = newd;
pre[j] = u;
}
}
}
}
}
int main()
{
int n;
n=5;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[i][j]=MAX;
}
}
c[1][2]=c[2][1]=10;
c[2][3]=c[3][2]=50;
c[4][3]=c[3][4]=20;
c[3][5]=c[5][3]=10;
c[4][5]=c[5][4]=60;
c[1][5]=c[5][1]=100;
c[1][4]=c[4][1]=30;
int d[100];
int pre[100];
dijkstra(n,1,d,pre);
for(i=1;i<=5;i++)
{
cout<<d[i]<<endl;
}
return 0;
}
这个实现使用的是array的方法。
其中的pre存放的是:”pre[i]“记录的是从源到顶点“i”的最短路径上的i的前一个顶点,初始的时候,对所有的"i!=1",置pre[i]=v(源)。当要输出最短路径经过的顶点,则可以利用pre这个数组。
例如:pre[2]=1,pre[3]=4,pre[4]=1,pre[5]=3
从顶点1到顶点5的最短路径是:1,4,3,5