Floyd算法
多源最短路算法,可计算任意点对之间的最短路长度,时间复杂度
Floyd算法思想十分简单,用
遍历
题目参考:洛谷:P6464
题解:遍历传送门,然后更新所有以传送门为中继点的最短路选择
代码参考:
#include <bits/stdc++.h>
using namespace std;
int ar[105][105];
int fl[105][105];
int n, m, ans = 2e9;
inline void reset()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fl[i][j] = ar[i][j];
}
int main()
{
cin >> n >> m;
memset(ar, -1, sizeof(ar));
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
ar[u][v] = w;
ar[v][u] = w;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (ar[i][k] != -1 && ar[k][j] != -1)
if (ar[i][j] == -1 || ar[i][j] > ar[i][k] + ar[k][j])
ar[i][j] = ar[i][k] + ar[k][j];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
reset();
fl[i][j] = fl[j][i] = 0;
for (int x = 1; x <= n; x++)
for (int y = 1; y <= n; y++)
if (fl[x][y] == -1 || fl[x][y] > fl[x][i] + fl[i][y])
fl[x][y] = fl[x][i] + fl[i][y];
for (int x = 1; x <= n; x++)
for (int y = 1; y <= n; y++)
if (fl[x][y] == -1 || fl[x][y] > fl[x][j] + fl[j][y])
fl[x][y] = fl[x][j] + fl[j][y];
int res = 0;
for (int x = 1; x <= n; x++)
for (int y = 1; y < x; y++)
res += fl[x][y];
ans = min(ans, res);
}
}
printf("%d\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具