首先感谢学长们的算法课!在七次课程中我总算是迈开了算法学习的第一步。然而因个人能力实在有限,有些知识没能很好地掌握。这次我将选取自己比较熟悉的Dijkstra算法进行整理。(因个人原因我对c++以及数据结构的大部分内容都比较陌生,所以博客中的错误还请各位多指正)
浅谈Dijkstra
1.解决问题
Dijkstra算法解决的是有权图的最短路径问题(指定两点间的最短路径,或指定点到其他所有点的最短路径)。需要注意的是,Dijkstra算法不适用于图存在负边的情况。
2.基本思想
贪心+动态规划
dis[i]:初始点到图上点i的距离(初始值:与初始点相邻的点dis值为边的权值,若不相邻,则为∞)。
visit[i]:图上点i是否已被最短路径经过(个人的理解是,当该节点已作为一个中间节点,在初始点到其他节点的路径上被经过时,使该节点的visit布尔值为true。仅在visit值为false中的节点寻找最小的dis值,是因为经过的节点无需经过第二次。)
1) 初始化:初始点s有dis[s]=0, 与初始点相邻的点dis值为边的权值,若不相邻,则为∞。所有点visit值都为false。
2) 在所有visit值为false的节点中找到一个dis值最小的,节点记作x。若所有visit值都为true,则算法结束。
3) 标记visit[x]=true,用x到相邻点距离更新与x相邻点的dis值:
dis[y] = min {dis[y] , dis[y] + w(x ,y ) }
其中y为x的相邻点,w
( x , y ) 为x ->y这条有有向边的权值(如果x,y不直接相邻,则令w(x,y)=∞)。
图示:
3.代码
以上图为例
输入:
5 6
2 3
1 3 8
2 3 16
2 5 2
3 4 11
4 5 5
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<iostream>
#inc