最短路径算法---Dijkstra---邻接矩阵

先放出原作者的链接:http://blog.51cto.com/ahalei/1387799

以下仅是我的学习过程,以便用时方便查找。

Dijkstra为“单源最短路径算法”

《最短路径算法---Dijkstra---邻接矩阵》 对应的邻接矩阵是—->《最短路径算法---Dijkstra---邻接矩阵》


1为起始地点,用Dijstra算法最终可以得到是到其他各点(2,3,4,5,6)的最短路径.

e[6][6]:表示矩阵的大小

 dis[6]:表示1到其他各点的距离,如:dis[3]:13的距离

book[6]:表示6个点被标记的情况,如:book[1]=1,表示1点已经被标记过,=0,表示未被标记过。

 n, m:分别表示图的顶点数和边数

 t1, t2, t3:分别表示开始顶点,结束顶点,边上的权值

 u:为标记的点中dis[i]值最小时对应的i

 min:最小距离

过程解读:

《最短路径算法---Dijkstra---邻接矩阵》

《最短路径算法---Dijkstra---邻接矩阵》

5结点遍历完之后遍历6,由于6没有指向别的结点,所以直接设定Book[6]=1 

算法结束!

《最短路径算法---Dijkstra---邻接矩阵》

#include <iostream>
using namespace std;
int main()
{
	int inf = 99999999;
	int e[10][10], dis[10], book[10], n, m, t1, t2, t3, u, min;
	//scanf_s("%d %d", &n, &m);///n表示顶点个数,m表示边的条数
	cin >> n >> m;
	///初始化
	for (int i = 1; i <= n; i++)///这里创建的是一个邻接矩阵,n*n的矩阵
		for (int j = 1; j <= n; j++)
			if (i == j) e[i][j] = 0;
			else e[i][j] = inf;
	///读入边
	for (int i = 1; i <= m; i++)
		{
			//scanf_s("%d %d %d", &t1, &t2, &t3);
			cin >> t1 >> t2 >> t3;
			e[t1][t2] = t3;
		}
	///初始化dis数组,这里要求的是1号顶点到其余各点的初始路程
	for (int i = 1; i <= n; i++)
	{
		dis[i] = e[1][i];
	}
	///初始化book数组,这里面存的是已经被标记过的点
	for (int i = 1; i <= n; i++)
		book[i] = 0;
	book[1] = 1;///表示1点是已经被标记过的点

	///核心代码
	for (int i = 1; i <= n - 1; i++)
		{
			min = inf;
			for (int j = 1; j <= n; j++)///找到dis中未标记点中的最小值
				{
					if (book[j] == 0 && dis[j]<min)
					{
						min = dis[j];
						u = j;
					}
				}
				book[u] = 1;

				for (int k = 1; k <= n; k++)///找到有箭头指向的结点
				{
					if (e[u][k]<inf)
					{
						if (dis[k]>dis[u] + e[u][k])
							dis[k] = dis[u] + e[u][k];
					}
				}
			}
			///输出最终结果
	for (int i = 1; i <= n; i++)
		//printf("%d ", dis[i]);
		cout << dis[i]<<" ";	
			return 0;
}

测试数据:

6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

运行结果:

0 1 8 4 13 17 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/qq_33579045/article/details/80008332
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞