Dijkstra算法 简易理解(原创)

算法思想:

  将所有顶点分为 两个阵营 [S]和[V-S],其中[S]是已经确定下最小路径的点,[V-S]是待确定最短路径的点
  不断地以[S]中的某个点作为中间点,改变[V-S]中某个点的路径。

代码如下:

#include "pch.h"
#include <iostream>
using namespace std;

void Dijkstra(int s,int n,int m);
void init_dij(void);
const int MAXV = 50, INF = 999999;
int S[MAXV];
int path[MAXV];
int arcs[MAXV][MAXV];//临界矩阵,代表两点间距离
int dist[MAXV];//每个顶点的最短距离

int main()
{
	init_dij();
	arcs[0][1] = 1; arcs[0][3] = 4; arcs[0][4] = 4;
	arcs[1][3] = 2; arcs[2][5] = 1; arcs[3][2] = 2;
	arcs[3][4] = 3; arcs[4][5] = 3;
	for (int i = 0; i < 6; i++) {
		arcs[i][i] = 0;
	}
	Dijkstra(0,6,8);
	for (int i = 0; i < 6; i++) {
		cout << dist[i] << endl;
		cout << endl;
	}
	for (int i = 0; i < 6; i++) {
		cout << path[i] << " ";
	}
}

void init_dij() {
	fill(S, S + MAXV, 0);//标记全置0
	for (int i = 0; i < MAXV; i++) {
		for (int j = 0; j < MAXV; j++)arcs[i][j] = INF;
	}
}
void Dijkstra(int s,int n,int m) {
	path[s] = s;//起点设置:认为他前置点为起点本身
	for (int i = 0; i < n; i++) {//初始化所有点先连向起始点
		if (arcs[s][i] != INF)path[i] = s;
	}
	for (int i = 0; i < n; i++) {
		dist[i] = arcs[s][i];//初始化dist为从起始点s至第i个点的距离
	}
	S[s] = 1;//将初始点放入到S中

	for (int i = 0; i < n; i++) {//进行n次循环
		int MIN = INF;
		int temp=-1;
		for (int j = 0; j < n; j++) {//从[V-S]中寻找到dist最小的点
			if (S[j] == 0 && dist[j] < MIN && dist[j]!=INF) {
				MIN = dist[j];
				temp = j;
			}
		}
		if (temp != -1) {
			S[temp] = 1;
			//修改[V-S]中各顶点的路径:以刚才选中的点作为中间桥梁
			for (int k = 0; k < n; k++) {
				if (S[k] == 0 &&  dist[temp] + arcs[temp][k] < dist[k]) {
					//对于[V-S]中的点,以temp做中间点后的路径长度变小,则发生替换
					dist[k] = dist[temp] + arcs[temp][k];//修改第k个点的dist
					path[k] = temp;
					//然后下一轮循环时,它会作为该顶点的新属性,与其他点竞选,如果他是最小的则选入S
				}
			}
		}
	}
}

  

 

posted @ 2019-05-17 00:06  Youngblood  阅读(584)  评论(0编辑  收藏  举报