Dijkstra最短路径算法的C++实现
Dijkstra最短路径算法是Dijkstra提出的一种贪心算法,有三个数组:原始数组P,存放节点数据;筛选数组S,存放比较过后的路径点;剩余节点D存放未比较的点的数据。输入节点数据,各节点之间没有直接路径时,路径长度设为无穷大INT_MAX,选出出发点以及目的点(默认为1和最后一个点),将1号点放入S,更新D,然后遍历D中与1号点距离最近的点(设为2号点),放入S中,比较D中各点通过2号点到1号点的路径变化,若路径变短,则更新该节点的路径信息(即L1-2+L2-3<L1-3,则更新L1-3=L1-2+L2-3),若路径不变或更长,D中节点信息不变,如此将D中节点路径长度更新完后,再选择下一个距1最近的点,放入S,更新D中路径信息。
通过遍历比较和更新,最后得到1号点到各个节点的最短路径长度。
C++代码
#include<iostream>
#include<limits.h>
#define N 100
using namespacestd;
int main()
{
using std::cout;
cout.setf(std::ios::left);
//输入节点数
int number;
cout<<"Please input your points number(from 1 to 100):";
cin>>number;
cout<<"The number of points is"<<number<<endl;
cout<<"Your starting point is1,and the destination is "<<number<<endl;
//输入数组,初始化各节点之间的路线长度
int p[N][N];
int j1,j2;
cout<<"Input the length(0 ~1000) to each points,if the way do not exist,input a number larger than 1000!!!"<<"\n";
for(int i=0; i<number; i++)
for(int j=i;j<number;j++)
{cout<<"Please inputthe path length from "<<i+1<<" to"<<j+1<<" is: ";
cin>>p[i][j];
p[j][i]=p[i][j];
}
//初始化d数组,存放1到各节点的距离
int d[N];
for(i=0;i<number;i++)d[i]=p[0][i];
//输出p数组,察看输入是否正确
for(i=0;i<number;i++)
{cout<<"\n";
for(int j=0;j<number;j++)
{cout.width(7);cout<<p[i][j];}
}
cout<<endl;
//设置两个集合S放置选中的节点
int s[N];
int v=0;
s[0]=1;
//选出集合中距1最近的节点,放入S中;
for(i=0;i<number;i++)
{ int min=INT_MAX;
for(j1=1;j1<number;j1++)
if((s[j1]!=1)&&p[i][j1]<min)
{min=p[i][j1];
v=j1;}
s[v]=1;
//找出D中值的变化
for(j2=1;j2<number;j2++)
if((s[j2]!=1)&&p[v][j2]<INT_MAX)
{if((p[v][j2]+d[v])<d[j2])
d[j2]=d[v]+p[v][j2];
};
}
//输出最短距离
cout<<"the shortest way from1" <<" to " <<number<<" is "<<d[number-1]<<endl;
return 0;
}