[原創]Dijkstra算法的簡單實現(C++)

[原創]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;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章