<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>最短路 on Zirnc's Blog</title><link>https://blog.chungzh.cn/blog/%E6%9C%80%E7%9F%AD%E8%B7%AF/</link><description>Recent content in 最短路 on Zirnc's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.chungzh.cn/blog/%E6%9C%80%E7%9F%AD%E8%B7%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>最短路笔记</title><link>https://blog.chungzh.cn/oi-history/shortest-path/</link><pubDate>Sat, 01 Oct 2022 00:00:00 +0000</pubDate><guid>https://blog.chungzh.cn/oi-history/shortest-path/</guid><description>又是一年 CSP 复赛，已经一年没写过最短路了，赶紧复习一下。
Floyd-Warshall 算法 Floyd 算法是用来求所有结点对最短路的。适用于所有不含负环的图。
这个算法运用了 DP 的思想。首先定义 f[k][i][j] 表示只允许经过结点 $1, 2, \cdots k$，结点 $i$ 到结点 $j$ 的最短路长度。初始化时，f[k][i][i] = 0，其他赋值为 $+\infty$。可以有 f[k][i][j] = min(f[k-1][i][j], f[k-1][i][k] + f[k-1][k][j])（f[k-1][i][j] 表示不经过 $k$ 点的最短路径，f[k-1][i][k] + f[k-1][k][j] 表示经过 $k$ 点的最短路径）。这时可以发现，数组的第一维是可以忽略的，所以直接写成 f[i][j] = min(f[i][j], f[i][k] + f[k][j])。
时间、空间复杂度均为 $O(N^3)$。
实现：
1 2 3 4 for (int k = 1; k &amp;lt;= n; k++) for (int i = 1; i &amp;lt;= n; i++) for (int j = 1; j &amp;lt;= n; j++) f[i][j] = min(f[i][j], f[i][k] + f[k][j]); 无向图的最小环问题 Luogu-P6175 无向图的最小环问题</description></item></channel></rss>