本算法是,找源点到其他所有点的最小距离。 以6个点为例
#include <iostream>
using namespace std;
int wq = 1000; //无穷大
int lamda[6]; //第0个点到第i个点的距离最小值
bool isused[6]={false}; //将所有点分为用过/未用的,等价伪代码的X,Y
void printlamda();
int minIndex();
void dijkstra(int len[][6]);
int main(){
int v[] = { 1,2,3,4,5,6 };// 没用到,本程序用0-5代表6个点
int length[6][6]={
0,1,12,wq,wq,wq,
wq,0,9,3,wq,wq,
wq,wq,0,wq,5,wq,
wq,wq,4,0,13,15,
wq,wq,wq,wq,0,4,
wq,wq,wq,wq,wq,0
};
lamda[0]=0;
isused[0]=true; //第0个点是源点,本程序找的0到其他点的距离
dijkstra(length);
printlamda();
return 0;
}
void printlamda(){
for(int i=0;i<6;i++){
printf("%d ",lamda[i]);
}
cout<<endl;
}
//未用的点中,lamda值最小的下标(第y个点)
int minIndex(){
int index = 0 , minvalue = wq;
for(int i = 1;i<6;i++){
if(isused[i]==false && lamda[i]<minvalue){
index = i;
minvalue=lamda[i];
}
}
printf("最小的点是第%d个\n",index);
return index;
}
void dijkstra(int len[][6]){
//lamda初始化
for(int j=1;j<6;j++){
if(len[0][j]!=wq){
lamda[j] = len[0][j];
}else{
lamda[j] = wq;
}
}
printlamda();
int y;
for(int j=1;j<=5;j++){
y = minIndex(); //没用过的点中,lamda中最小值的下表(第y个顶点)
isused[y] = true;
for(int w=0;w<6;w++){
if(isused[w]==false && lamda[y]+len[y][w]<lamda[w]){
lamda[w] = lamda[y]+len[y][w];
}
}
}
}