ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

最短路径的Dijkstra算法

2020-01-11 12:03:31  阅读:320  来源: 互联网

标签:numVEXS int vk 路径 算法 最短 v0 Dijkstra arc


核心思想:基于已经求出的最短路径的基础上,求得更远顶点的最短路径。
在每次大循环内:
1.在D数组中找出当前离v0最近的顶点vk(vk是在所有还未被确定最短路径的顶点中选出。因为已经被确定最短路径的顶点和v0的距离已经是最短的了,而且是必定不会改变的),并在flag数组中把下标为k的元素置1;
2.在已经找到v0与vk的最短路径的基础上,对和vk直接相连的且未被确定的顶点进行计算,得到v0与它们的当前距离,并对D数组进行修正
大循环结束后,flag数组全为1,表明所有的顶点都完成了最短路径的查找工作,即v0到任何一个顶点的最短路径都已经被求出。

特点:对于每次循环确定的vk,v0与vk的距离是不断增加的。

#include<iostream>
using namespace std;
#define MAXVEX 9
#define INFINITY 65536
typedef struct {
	int arc[MAXVEX][MAXVEX];//邻接矩阵
	int numVEXS;//顶点个数
}MGraph;
void ShortestPath_Dijkstra(MGraph&G);
int main() {
	MGraph G;
	G.numVEXS = 9;
	for (int i = 0; i < G.numVEXS; i++)
		for (int j = 0; j < G.numVEXS; j++)
		{
			if (i < j)
				G.arc[i][j] = INFINITY;
			if (i == j)
				G.arc[i][i] = 0;
		}

	G.arc[0][1] = 1; G.arc[0][2] = 5;
	G.arc[1][2] = 3; G.arc[1][3] = 7; G.arc[1][4] = 5;
	G.arc[2][4] = 1; G.arc[2][5] = 7;
	G.arc[3][4] = 2; G.arc[3][6] = 3;
	G.arc[4][5] = 3; G.arc[4][6] = 6; G.arc[4][7] = 9;
	G.arc[5][7] = 5;
	G.arc[6][7] = 2; G.arc[6][8] = 7;
	G.arc[7][8] = 4;
	for (int i = 0; i < G.numVEXS; i++)
		for (int j = 0; j < G.numVEXS; j++)
		{
			if (i < j)
				G.arc[j][i] = G.arc[i][j];
		}

	ShortestPath_Dijkstra(G);

	system("pause");
	return 0;
}

void ShortestPath_Dijkstra(MGraph&G) {
	int k, min;
	int D[MAXVEX] = { 0 }, P[MAXVEX] = { 0 }, flag[MAXVEX] = { 0 };//D[v]表示v0到v的最短路径长度和,final[v]=1表示v0到v的最短路径已经被求出,P数组用来最终确定路径用
	for (int i = 0; i < G.numVEXS; i++)
		D[i] = G.arc[0][i];
	flag[0] = 1;//v0到v0不需要求最短路径

	//start
	for (int n = 1; n < G.numVEXS; n++) {//开始大循环(次数为G.numVEXS-1)
		min = INFINITY;
		for (int i = 0; i < G.numVEXS; i++)
		{
			if (!flag[i] && D[i] < min)
			{
				min = D[i];//找出当前离v0最近的且未被确定的顶点vk
				k = i;//记录下标
			}
		}
		flag[k] = 1;//把顶点vk置为1

		//在已经找到v0与vk的最短路径的基础上,对和vk直接相连的且未被确定的顶点进行计算,得到v0与它们的当前距离
		for (int i = 0; i < G.numVEXS; i++)
		{
			if (!flag[i] && min + G.arc[k][i] < D[i]) //如果找到了更短的路径,则修正D和P
			{
				D[i] = min + G.arc[k][i];
				P[i] = k;//表示vk是vi的前驱
			}

		}
	}
	//打印路径
	while (P[k] != k) {
		cout << P[k] << "-->" << k << endl;
		k = P[k];
	}
}
ShenHang_ 发布了146 篇原创文章 · 获赞 3 · 访问量 4958 私信 关注

标签:numVEXS,int,vk,路径,算法,最短,v0,Dijkstra,arc
来源: https://blog.csdn.net/ShenHang_/article/details/103927673

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有