一、朴素Dijkstra算法模板
输入描述
3 3
1 2 2
2 3 1
1 3 4
输出描述
3
这是稠密图因此采用邻接矩阵的方式来存储图的信息。
参考文献:https://www.acwing.com/solution/content/5806/
首先Dijkstra算法就是要找到每个点到起点的最短距离,最后输出终点到起点的最短距离。
那么我们就需要两个数组来存储信息。
int dist[N];//该点到起点的最短距离
bool st[N];//判断是否已经找到该点到起点的最短距离
然后我们要找到每个点到起点的最短距离
- 首先将起点看成一个集合S,其余的点看成另一个集合S1,每次都从S1中提取出距离起点最近的点,那么我们要怎么找到这个点呢。这里有两种方法。
第一种方法:
int mindis = Inf;//这里的Inf再开始的时候定义为一个很大的值
for(int j = 1 ; j <= n ; j++)
{
if(!st[j] && dist[j] < mindis)
{
mindis = dist[j];
t = j;
}
}
第二种方法:
t = -1;
for(int j = 1 ; j < = n ; j ++)
{
if(!st[j] && (t == -1 || dist[j] < dist[t]))//寻找还未确定最短路的点中路径最短的点
{
t = j;
}
}
- 然后用找出来的点来更新其邻接点的距离。
for(int j = 1 ; j <= n ; j++)
{
dist[j] = min(dist[j],dist[t] + G[t][j]);
}
完整代码
#include <iostream><