「学习笔记」Floyd 的应用
求最短路#
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
求最小环#
过程#
记原图中 之间边的边权为 。
我们注意到 Floyd 算法有一个性质:在最外层循环到点 时(尚未开始第 次循环),最短路数组 dis
中, 表示的是从 到 且仅经过编号在 区间中的点的最短路。
由最小环的定义可知其至少有三个顶点,设其中编号最大的顶点为 ,环上与 相邻两侧的两个点为 ,则在最外层循环枚举到 时,该环的长度即为 。
故在循环时对于每个 枚举满足 的 ,更新答案即可。
时间复杂度:
int floyd(int n) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
dis[i][j] = val[i][j];
}
}
int ans = inf;
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i < k; ++ i) {
for (int j = 1; j < i; ++ j) {
ans = min(ans, dis[i][j] + val[i][k] + val[k][j]);
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
return ans;
}
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i < k; ++ i) {
for (int j = 1; j < i; ++ j) {
ans = min(ans, dis[i][j] + val[i][k] + val[k][j]);
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
第一个循环为找最小环,第二个循环为正常更新 dis
数组。
求任意两点的最短路径数#
记 g[x][y]
数组,再求最短路的时候一起维护即可。
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
if (dis[i][k] + dis[k][j] > dis[i][j]) {
continue;
}
else if (dis[i][k] + dis[k][j] < dis[i][j]) {
dis[i][j] = dis[i][k] + dis[k][j];
g[i][j] = g[i][k] * g[k][j];
}
else {
g[i][j] += g[i][k] * g[k][j];
}
}
}
}
传递闭包#
即已知一个有向图中任意两点之间是否有连边,要求判断任意两点是否连通。
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
dis[i][j] |= dis[i][k] & dis[k][j];
}
}
}
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17365299.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
朝气蓬勃 后生可畏
分类:
基础图论知识
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)