[原创]Dijkstra算法的简单实现(C++)
最近在看《算法导论》,将Dijkstra算法实现了一下。网上的实现都太复杂,自己写了一个简单的版本。
1,2,3,4,5一共5个顶点。v[5]表示存储的尚未输出的顶点矩阵。s[5]表示存储的已输出的顶点矩阵。a[5][5]用有向邻接图存储顶点间的距离信息。
// Dijkstra-algorithm.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int distance[5];//原点到其他点的距离矩阵,每一轮中不断更新
int s[5];//已输出的顶点矩阵
int v[5] = {1,2,3,4,5};//未输出的顶点矩阵
int max = 9999;
int pos=0;//每一轮中要选择输出顶点的序号
bool flag[5];//顶点有无输出的矩阵
int a[5][5] = {0,5,3,max,max,
max,0,max,6,max,
max,max,0,4,7,
max,max,max,0,1,
max,max,max,max,0};//定义一个有向邻接图矩阵
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
cout<< a[i][j]<<" ";
if (j==4) {
cout << endl;//输出该矩阵
}
}
}
for (int i = 0; i < 5;i++) {
distance[i] = a[0][i];//赋值给distance数组
flag[i] = false;
}
for (int i = 0; i < 5; i++) {
int min;
for (int s = 0; s < 5; s++) {
if (flag[s] != true)
min = distance[s];//未纳入时设为最小值
}
for (int j = 0; j < 5; j++) {
if (distance[j] <= min&&flag[j] != true) {
min = distance[j];
pos = j;
}
}//遍历查找最小距离
s[pos] = v[pos];
v[pos] = NULL;
flag[pos] = true;
cout << "距离矩阵:";
for (int k = 0; k < 5; k++) {
if (distance[k] >distance[pos] + a[pos][k]) {
distance[k] = distance[pos] + a[pos][k];//距离更新
}
cout << distance[k] << " ";
}
cout << "将" << pos+1 << "输出." << endl;
}
return 0;
}