目录
Dijkstra算法
算法简介
Dijkstra算法是由荷兰计算机科学家Dijkstra于1959年提出的,因此又叫Dijkstra算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
(来自百度百科)
实现方法
使用dis数组记录目标到各结点的距离。
通过查询dis数组中的最小值更新其他路径,这个操作我们称作松弛。
dis[j] = min(dis[j],dis[i] + edge[i][j])
由上面的转换我们可以知道当前dis数组中的最小值无法被其他值松弛,
所以我们就可以利用这个最小值来松弛其他边,然后对它做一个标记。
那么使用flag数组记录已经无法被更新最短路的点。
(下面是未加优化的Dijkstra算法)
#include<iostream>
using namespace std;
const int edge_size = 100050;
const int node_size = 10050;
const int inf = 1e9;
int n,m,goal;
int dis[node_size];
bool flag[node_size];
int first_edge[node_size];
struct edge {
int val,to,next;
edge() {
val = to = next = 0;
}
edge(int a,int b,int c) {
val = a;
to = b;
next = c;
}
} data[edge_size];//邻接表存图
void add_edge(int from,int to,int val,int i) {
data[i] = edge(val,to,first_