最短路径算法
Floyed-Warshall
采用 dp 的思想。设 \(dp_{(i,j)}\) 表示 \(i\) 到 \(j\) 的最短路径,那么对于任意的 \(k\),\(dp_{(i,j)}=\min(dp_{(i,j)}, dp_{(i,k)} + dp_{(k,j)})\)。
void floyed() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
}
}
Dijkstra
采用贪心的思想,求一个点到其他点的最短路。每一步都从最短的路经走到其他地方,一般使用 \verb|priority_queue| 进行取最小值。此算法不能处理负边权的情况。
void dijkstra(int s) {
priority_queue<Edge> q;
fill(d + 1, d + n + 1, 1e9);
fill(f + 1, f + n + 1, 0);
for (q.push({s, 0}), d[0] = 0; q.size(); ) {
Edge t = q.top();
q.pop();
if (f[t.to]) {
continue;
}
f[t.to] = 1;
for (auto i : e[t.to]) {
if (d[t.to] + i.v < d[i.to]) {
d[i.to] = d[t.to] + i.v;
q.push({i.to, d[i.to]});
}
}
}
}
Sortest Path Faster Algorithm
关于 SPFA,她死了。

浙公网安备 33010602011771号