• Dijistra及其堆优化
  • Bellman-Ford及其队列优化(SPFA)
  • Floyd-Warshall算法

Dijistra算法及其堆优化

Dijistra算法

  • 适用于单源最短路径
  • 不适用于权为负数的情况
  • 时间复杂度O(n2)

大致思路:设起点为s

先找到离s最近的结点t,则此时dis[t]则为s到t的最短路,即dis[t]值已经固定。

用t来更新其它结点(松弛)

dis[r] = min(dis[r], dis[t] + cost[t][r]);

重复上述过程。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<cstdio>
#include<algorithm>
using namespace std;

const int MAX_N = 100 + 5;
const int INF = 1e9;

int n, A, B;
int cost[MAX_N][MAX_N];
int vis[MAX_N];
int dis[MAX_N];

void Dijistra()
{
for(int i = 1; i <= n; ++i) //每个点都访问一次
{
int x, m = INF;
for(int y = 1; y <= n; ++y) //找到和y最近的点
if(!vis[y] && dis[y] <= m)
m = dis[x = y];

vis[x] = 1;
for(int y = 1; y <= n; ++y) //松弛/更新其它边
dis[y] = min(dis[y], dis[x] + cost[x][y]);
}
}

int main()
{
fill(cost[0], cost[0] + MAX_N * MAX_N, INF);

for(int i = 1; i <= n; ++i)
{
dis[i] = cost[A][i];
}

dis[A] = 0;
vis[A] = 1;

Dijistra();

return 0;
}