当前位置: 首页 > news >正文

多源最短路径算法(竞赛)

一、思路

和松弛思想一样,任意两点之间的最短距离不可能全是直接的从 i 到 j,一定会有中间节点,所以我们设任意两点最短路径之间存在 k 个节点,分别遍历出 k 从 1 到 n 节点最小路径值那就是 ij 两点之间的最短路径算法。

dp 方程:

不选中间节点:dp[k][i][j] = dp[k - 1][i][j];
选中间节点 k:dp[k][i][j] = dp[k - 1][i][k] + dp[k - 1][k][j];
这一层的k完全依赖于上一层的k - 1,所以变成二维
因为要取min,而且一开始ij不知道多长,所以不知道的ij是无穷,ii才是0

二、例题

B3647 【模板】Floyd - 洛谷

#include "bits/stdc++.h"
using namespace std;
int n, m;
const int N = 110;
const int INF = 0x3f3f3f3f;
// 要求ij距离,i直接到j不一定是最短距离,所以要在ij之间添加k个节点,逐渐计算
// i ... k1 ... k2 ... j中最短的那个距离,所以是k从1开始遍历,每添加一个k就取一次min
// 不选中间节点:dp[k][i][j] = dp[k - 1][i][j];
// 选中间节点 k:dp[k][i][j] = dp[k - 1][i][k] + dp[k - 1][k][j];
// 这一层的k完全依赖于上一层的k - 1,所以变成二维
// 因为要取min,而且一开始ij不知道多长,所以不知道的ij是无穷,ii才是0

void F()
{
	vector<vector<int>> dp(n + 1, vector<int>(n + 1, INF));
	while(m--)
    {
        int u, v, w;
        cin >> u >> v >> w;
        // 取min防止给我重复的大的权值 
		dp[u][v] = dp[v][u] = min(dp[u][v], w);
    }
    for(int i = 1; i <= n; i++)
        dp[i][i] = 0;
    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]);
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cout << dp[i][j] << ' ';
        }
        cout << endl;
    }            
}


int main()
{
    cin >> n >> m;
    F();
    return 0;
}

相关文章:

  • 第45章:配置更新与应用热重载策略
  • VMware上对CentOS7虚拟机进行磁盘扩容、缩容
  • Uthana,AI 3D角色动画生成平台
  • Python第六章08:元组操作练习题
  • C++ 学习笔记(四)—— 类和对象
  • 【计算机操作系统】深入剖析操作系统中的存储器管理:从基础到高级
  • 如何高效参与 GitHub 知名项目开发并成为核心贡献者
  • Ubuntu Debian 系统下挂载 Samba 共享目录的完整指南
  • 用java写一个简易的本地聊天室
  • 使用vscode搭建pywebview集成vue项目示例
  • bonding技术
  • span与span之间的空白如何解决?
  • Shopify Checkout UI Extensions
  • 电阻的阻值识别
  • 数据结构5(初):排序
  • 【跟着灵神刷力扣】定长滑动窗口
  • 【动态规划】相关复习
  • python数据增强和转换
  • linux 设置tomcat开机自启动
  • 面试常问系列(一)-神经网络参数初始化
  • 韩正会见美国景顺集团董事会主席瓦格纳
  • 媒体评欧阳娜娜遭民进党当局威胁:艺人表达国家认同是民族大义
  • 杨文庄当选中国人口学会会长,曾任国家卫健委人口家庭司司长
  • “女硕士失踪13年生两孩”案进入审查起诉阶段,哥哥:妹妹精神状态好转
  • 法学联合书单|法庭上的妇女
  • 外交部:反对美方人士发表不负责任谬论