多源最短路的两种做法和详细解析

Floyd算法(多源最短路) 简介 Floyd算法是一个经典的动态规划算法,它又被称为插点法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,算法目标是寻找从点i到点j的最短路径。 实现原理 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,算法假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,算法检查Dis(i,k) + Dis(k 阅读详情

一、概述

前置知识:单源最短路请参考这篇文章。

最短路算法是图论算法中的一个分支,大致可以分为单源最短路和多源最短路两种。单源最短路指从一个点去往图中的其他点所花费的最短距离,而多源最短路指图中任意两个点的最短距离。
多源最短路可以通过运行 N N N( N N N 为图的点数, M M M 为图的边数)次单元最短路(dijkstra,bellman-ford,SPFA)来实现。运行 N N N 次单元最短路的算法复杂度如下:

算法名称单次复杂度 N N N 次复杂度
dijkstra O ( ( N + M ) log ⁡ M ) O((N+M)\log M) O((N+M)logM) O ( N ( N + M ) log ⁡ M ) O(N(N+M)\log M) O(N(N+M)logM)
bellman-ford O ( M 2 ) O(M^2) O(M2) O ( N M 2 ) O(NM^2) O(NM2)
SPFA O ( k M ) O(kM) O(kM) O ( k M N ) O(kMN) O(kMN)

运行 N N N 次多源最短路的代码复杂度较高(需要将单元最短路的算法嵌套在一个 for 循环里面,还需特别注意初始化的问题),但专门用于解决多源最短路问题、基于动态规划实现的 Floyd 算法,可以使用 5 5 5 行代码,用 O ( N 3 ) O(N^3) O(N3) 且较为稳定的时间复杂度解决这个问题。

二、Floyd 算法的原理讲解

Floyd 算法是基于动态规划实现的最短路算法,主要包括初始化和进行动态规划的过程两部分。

1. 初始化:

使用 Floyd 算法计算需要使用一个邻接矩阵 E E E 来存图。进行输入的时候,依据题意建立无向边或者有向边。例如,令图中一条边的两个端点分别为 u , v u,v u,v ,边权为 w w w ,当输入格式为 u   v   w u \text{ } v \text{ } w u v w 时,我们可以这样通过输入建立一个邻接矩阵:

  • 使 E ( i , j ) = ∞   ( i , j ∈ [ 1 , N ]   and   i ≠ j ) E(i,j)= \infin \text{ } (i,j \in [1,N] \text{ } \text{ and } \text{ }i \not= j) E(i,j)=∞ (i,j∈[1,N]  and  i=j)
  • 输入为 1   2   3 1 \text{ } 2 \text{ } 3 1 2 3 ,使 E ( 1 , 2 ) = 3 , E ( 2 , 1 ) = 3 E(1,2)=3,E(2,1)=3 E(1,2)=3,E(2,1)=3 ,这样可以建立无向边
  • 输入为 1   3   4 1 \text{ } 3 \text{ } 4 1 3 4 ,使 E ( 1 , 3 ) = 4 , E ( 3 , 1 ) = 4 E(1,3)=4,E(3,1)=4 E(1,3)=4,E(3,1)=4
  • 这样我们建立了一个如下样式的图:
    在这里插入图片描述

使用邻接矩阵表示为:
E = [ 0 3 4 3 0 ∞ 4 ∞ 0 ] E=\begin{bmatrix} 0 & 3 & 4 \\ 3 & 0 & \infin \\ 4 & \infin & 0 \end{bmatrix} E= ​034​30∞​4∞0​ ​

使用 Floyd 算法时需要注意必须使用邻接表存图,否则 Floyd 算法在运算过程中不能高效率地处理边权的问题。

2. 算法的原理以及其过程

Floyd 算法是基于动态规划算法实现的一种最短路算法,因此我们需要使用分析 DP 的思路来分析 Floyd 算法的原理和过程。

Floyd 算法的大致过程如下:
该算法可以大致的表示为中转法。
依次枚举可以中转的点 k ∈ [ 1 , N ] k \in [1,N] k∈[1,N] ,然后看点 i , j i,j i,j 之间的最短距离能否被上一步计算的从 i i i 到 k k k 的最短距离和从 k k k 到 j j j 的最短距离更新。如果可以,就让 f ( i , j ) f(i,j) f(i,j) 进行一次松弛操作。例如:

  • 我们先假设有一个如下样式的图。
    在这里插入图片描述
  • 首先,我们先按照上面的方法进行初始化,让整个邻接矩阵变成如下样式:
    E = [ 0 3 2 1 3 0 ∞ 5 2 ∞ 0 2 1 5 2 0 ] E= \begin{bmatrix} 0 & 3 & 2 & 1 \\ 3 & 0 & \infin & 5 \\ 2 & \infin & 0 & 2 \\ 1 & 5 & 2 & 0 \end{bmatrix} E= ​0321​30∞5​2∞02​1520​ ​
    其中, ∞ \infin ∞ 表示还未找到长度的点。
    我们直接把 E E E 这个邻接矩阵看作为已知的临时最短路径答案。
  • 然后,我们以 1 1 1 作为中转点,枚举已知的点。此时,我们可以更新 E ( 2 , 4 ) , E ( 4 , 2 ) , E ( 3 , 2 ) , E ( 2 , 3 ) E(2,4),E(4,2),E(3,2),E(2,3) E(2,4),E(4,2),E(3,2),E(2,3) 的值。此时整个邻接矩阵变成如下样式:
    E = [ 0 3 2 1 3 0 5 4 2 5 0 2 1 4 2 0 ] E= \begin{bmatrix} 0 & 3 & 2 & 1 \\ 3 & 0 & 5 & 4 \\ 2 & 5 & 0 & 2 \\ 1 & 4 & 2 & 0 \end{bmatrix} E= ​0321​3054​2502​1420​ ​
  • 我们以 2 2 2 作为中转点,枚举已知的点。此时,我们可以根据上面的邻接矩阵更新当前的状态,不能更新任何一项的值。
  • 同理,我们使用 3 , 4 3,4 3,4 作为中转点,均不能使 E E E 变化。
  • 因此,记 i , j i,j i,j 之间的最短路为 E ( i , j ) E(i,j) E(i,j) ,则最终的答案是:
    E = [ 0 3 2 1 3 0 5 4 2 5 0 2 1 4 2 0 ] E= \begin{bmatrix} 0 & 3 & 2 & 1 \\ 3 & 0 & 5 & 4 \\ 2 & 5 & 0 & 2 \\ 1 & 4 & 2 & 0 \end{bmatrix} E= ​0321​3054​2502​1420​ ​

下面我们开始介绍如何使用动态规划 DP \texttt{DP} DP 策略解决这个问题。
我们先记 d ( i , j ) d(i,j) d(i,j) 表示 i , j i,j i,j 之间的距离。
我们先使中转点 k ∈ [ 1 , N ] k \in [1,N] k∈[1,N] 。
通过上面的过程,我们可以发现,每一次更新当前的最短路都会依据前一次的最短路计算结果更新当前的计算结果。因此,状态 d d d 其实应该是 3 3 3 维的,记 d ( i , j , k ) d(i,j,k) d(i,j,k) 表示以 p ∈ ∀ [ 1 , k ] p \in \forall[1,k] p∈∀[1,k] 为中转点的 i , j i,j i,j 之间的最短距离。可以看出,每个点位有两种可能的情况:
d ( i , j , k ) = { d ( i , j , k − 1 ) 不使用上一步的数值更新当前的数值 d ( i , k , k − 1 ) + d ( k , j , k − 1 ) 使用上一步的  d ( i , k )  和  d ( k , j )  更新 d(i,j,k)=\begin{cases} d(i,j,k-1) &\text{不使用上一步的数值更新当前的数值} \\ d(i,k,k-1)+d(k,j,k-1) &\text{使用上一步的 } d(i,k) \text{ 和 } d(k,j) \text{ 更新} \end{cases} d(i,j,k)={d(i,j,k−1)d(i,k,k−1)+d(k,j,k−1)​不使用上一步的数值更新当前的数值使用上一步的 d(i,k) 和 d(k,j) 更新​
显然,最后的最短距离即两者之间的最小值。因此,我们得到了 Floyd 算法的 DP \texttt{DP} DP 状态转移方程:
d ( i , j , k ) = min ⁡ { d ( i , j , k − 1 ) , d ( i , k , k − 1 ) + d ( k , j , k − 1 ) } d(i,j,k)=\min\{d(i,j,k-1),d(i,k,k-1)+d(k,j,k-1)\} d(i,j,k)=min{d(i,j,k−1),d(i,k,k−1)+d(k,j,k−1)}

显然,当前的状态 d ( i , j , k ) d(i,j,k) d(i,j,k) 是一个三维的状态。下面考虑优化,将三维的状态划分为二维的状态。
∵ d ( i , j , k ) = min ⁡ { d ( i , j , k − 1 ) , d ( i , k , k − 1 ) + d ( k , j , k − 1 ) } \because d(i,j,k)=\min\{d(i,j,k-1),d(i,k,k-1)+d(k,j,k-1) \} ∵d(i,j,k)=min{d(i,j,k−1),d(i,k,k−1)+d(k,j,k−1)} ,
∴ d ( i , j , k ) \therefore d(i,j,k) ∴d(i,j,k) 只和 d ( p , q , k − 1 )   ( p = i  or  p = k , q = k  or  q = j ) d(p,q,k-1) \text{ } (p=i\text{ or }p=k,q=k \text{ or }q=j) d(p,q,k−1) (p=i or p=k,q=k or q=j) 的值有关。
∴ \therefore ∴ 根据 0/1 背包的优化方法,我们可以让 d ( i , j , k ) d(i,j,k) d(i,j,k) 用同样的方法变成二维的状态 d ( i , j ) d(i,j) d(i,j) 。
∴ \therefore ∴ 此时状态转移方程变为:
d ( i , j ) = min ⁡ k ∈ [ 1 , N ] { d ( i , k ) + d ( k , j ) } d(i,j)=\min_{k \in [1,N]}\{d(i,k)+d(k,j)\} d(i,j)=k∈[1,N]min​{d(i,k)+d(k,j)}
利用上面的状态转移方程,我们可以将空间复杂度优化到 O ( N 2 ) O(N^2) O(N2) 。

3. 例题展示和代码实例

在这里插入图片描述
在这里插入图片描述
使用 Floyd 算法和两点间距离公式 s = ( x 0 − x 1 ) 2 + ( y 0 − y 1 ) 2 s= \sqrt{(x_0-x_1)^2+(y_0-y_1)^2} s=(x0​−x1​)2+(y0​−y1​)2 ​ 即可解决。代码如下:

#include <bits/stdc++.h>

using namespace std;

const int N = 157;

struct Node
{
    double x, y;
} a[N];

int n, f[N], k;
double d[N][N], e[N][N], ans = 1e9, ma[N], f_ma[N];

void dfs(int x)
{
    for (int i = 1; i <= n; ++i)
    {
        if (x == i) continue;
        if (e[x][i] > 1e8) continue;
        if (f[i]) continue;

        f[i] = k;
        dfs(i);
    }
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i].x >> a[i].y;
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            int t;
            scanf("%1d", &t);
            
            if (t == 0) 
            {
                if (i != j) e[i][j] = 1e9;
                else e[i][j] = 0;
            }
            else
            {
                e[i][j] = sqrt((a[j].x - a[i].x) * (a[j].x - a[i].x) + (a[j].y - a[i].y) * (a[j].y - a[i].y) * 1.0);
            }
        }
    }

    for (int i = 1; i <= n; ++i)
    {
        if (f[i]) continue;
        
        f[i] = ++k;
        dfs(i);
    }

	//Floyd
    memcpy(d, e, sizeof(e));
    for (int k = 1; k <= n; ++k)
    {
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }
    //Floyd-end

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (f[i] == f[j])
            {
                ma[i] = max(ma[i], d[i][j]);
            }
        }

        f_ma[f[i]] = max(f_ma[f[i]], ma[i]);
    }

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (f[i] == f[j]) continue;

            double t = max(max(f_ma[f[i]], f_ma[f[j]]), ma[i] + sqrt((a[j].x - a[i].x) * (a[j].x - a[i].x) + (a[j].y - a[i].y) * (a[j].y - a[i].y) * 1.0) + ma[j]);
            ans = min(ans, t);
        }
    }

    cout << fixed << setprecision(6) << ans << endl;

    return 0;
}
多源最短路问题(迪杰斯特拉变形) 题目 题意大概就是给你p个点,要你求出每个点离其它p-1个点中最近的点的距离。 开始看见多源最短路就想用Floyd,一看数据量 1e5,直接嗝屁。 后来百思不得其解。 在逛了一大堆大佬的题解之后终于有点明白。 首先放弃了Floyd之后我们可以想想其他的解法,p遍djikstra是复杂度是O(p * mlogn), p 和 m都是1e5,直接爆炸。 那我们想想看能不能将djiksra优化一下呢?既然有多个起点,那么我们在djikstra开始的时候就将所有起点放入优先队列中,然后开始正常松弛。 很容易发现这样松 阅读详情

相关推荐

[图论]万字解析图的最短路算法(详细带图解和代码)

图的最短路算法图的存储方式领接矩阵领接表最短路算法知识框架单源最短路径路径权值全为正数dijkstra算法(版本1)dijkstra(堆优化版本)路径权值存在负数bellmanFord算法spfa算法(基于bellmanFord的优化)多源最短路径(Floyd算法)参考文章 图的存储方式 图主要有以下两种表示方法:邻接矩阵和邻接表(注意,本文仅讨论有向图的情况) 领接矩阵 假设我们有以下的图 每个圈表示一个图中节点,圈里面的数字表示此节点编号,每个边都有权重 我们可以用一个二维数组存储这个图:设此二维矩阵

dtxew love c++ 1288

【算法模板】图论单源|多源最短路

图论算法模板 图论 【模板】dirjkstra单源最短路径 【模板】Bellman-Ford多源最短路 【模板】Spfa求最短路 【模板】Spfa判断负环 【模板】Floya 【模板】Kruskal最小生成树

向往有那么一天梦幻的步态识别落地,开花❀! 1074

MATLAB求解多源点最短路

matlab求解多源点最短路问题 代码是自己写的,下载后可以修改下

图论、DP思想——多源最短路径Floyd-Warshall 算法

1.算法简介: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。 在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。 虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。...

Jayphone17的博客 1571

记一次在JAVA中客户端使用axis调用webservice服务端出现的异常:Unmarshalling Error: For input string: ""

在使axis调用webservice服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet

kry1201的专栏 8080

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 234

算法学习(23)—— 多源BFS问题

给我们一个二进制矩阵,0表示海洋,1表示陆地,可以从任意一个陆地的上下左右四个方向移动,一次移动是从一个1走到另一个相邻的1,返回无法在任意次数的移动中离开网格边界的陆地单元格的数量。这道题和前面的也几乎是一样的,但是有一点点差别,这道题要我们找到离海洋最远的那个陆地,最后要我们返回这个最远的距离,如果全是海洋或全是陆地返回-1。

aaqq800520的博客 1070

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

【基础算法总结】多源 BFS_多源最短路问题

多源 BFS_多源最短路问题

fight_p的博客 2022

SillyTavern与Claude Code API集成:从零搭建AI聊天酒馆的完整指南

本文提供了一份从零搭建SillyTavern AI聊天前端的完整指南,重点讲解如何将其与Claude Code API集成。内容涵盖Node.js环境准备、SillyTavern部署、OpenAI兼容格式的API配置、模型选择与参数调校,以及角色扮演、扩展功能等高级玩法,帮助用户打造本地化、可定制的专属AI聊天体验。

assembly8low的博客 2607

手把手教你搭建Howland电流源:从原理图到实测避坑指南(附Python数据分析)

本文详细介绍了Howland电流源的设计与实现,从原理图到实测避坑指南,涵盖电阻匹配、运放选择和PCB布局等关键环节。通过Python数据分析,展示了如何优化电路性能并解决常见问题,适合电子工程师和爱好者参考。

weixin_29291069的博客 632

最短路算法总结(超详细~)

文章目录最短路算法框架朴素Dijkstra算法堆优化版Dijkstra算法 最短路算法框架 最短路有五种算法,分别适用不同的情况。 单源最短路: 求一个点到其他点的最短路 多源最短路: 求任意两个点的最短路 稠密图用邻接矩阵存,稀疏图用邻接表存储。 稠密图: m 和 n2 一个级别 稀疏图: m 和 n 一个级别 朴素Dijkstra算法 Dijkstra算法是通过 n 次循环来确定 n 个点...

wmy0217_的博客 4万+

AI颠覆市场调研:生成式智能体如何重构商业决策?

AI正在将市场调研从"成本中心"转变为"战略武器"。当企业能够用生成式智能体实时模拟百万级虚拟用户时,传统调研的样本偏差、时间滞后、成本高昂等问题将不复存在。对于开发者而言,这不仅是技术的狂欢,更是参与商业规则重构的历史机遇。行动建议立即体验Simile/Aaru的智能体平台,验证虚拟样本效果参与LLM持续性记忆架构的开源项目(如Memory Llama)关注AI调研API的标准化进程(如Hugging Face的Market Research Toolkit)

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 614

BFS 解决多源最短路问题

542. 01 矩阵、1020. 飞地的数量、1765. 地图中的最高点、1162. 地图分析

Dirty_artist的博客 1778

MOS管的体二极管在LLC中的作用

MOSFET是一个三端器件(G、D、S),在N沟道MOSFET的结构中,源极和漏极之间的N型材料中自然形成了一个寄生的PN结,这个PN结就是体二极管(Body Diode),它是不可避免的器件结构。📌 对于N沟MOSFET:体二极管是从漏极 D 到源极 S 的正向导通二极管,方向为 D → S。MOS管的体二极管在LLC中并不是主功率通道,但却是实现软开关(ZVS)和能量过渡的关键“临时路径”。用得好,它是你的朋友;忽略它,电路就可能烧毁。

weixin_43199439的博客 699

华为OD机试双机位C卷-组装新的数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【组装新的数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 组装新的数组。

qq_45776114的博客 1145

【洛谷】图论 图论最短路算法全解:从单源 Dijkstra 到多源 Floyd 模板与实战

本文系统梳理图论中两类核心最短路问题:单源最短路与多源最短路。详细讲解基于贪心思想的 Dijkstra 算法(含常规版与堆优化版),以及基于动态规划的 Floyd 插点法,包含算法原理、状态转移、代码实现与边界处理,并提供竞赛模板,帮助读者快速掌握最短路问题的求解思路与工程实现。

2501_90265152的博客 1421

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

图论 24. Floyd算法(多源最短路问题)

​。

m0_49844155的博客 1281

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法_BFS解决多源最短路问题---持续更新

本文将会向你介绍有关宽度优先搜索(BFS)解决多源最短路问题的相关题型:矩阵、飞地的数量、地图中的最高点、地图分析。

Moonnight_bit的博客 1027

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最短路问题--最通俗易懂的讲解

最短路径的定义: 所谓最短路径是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。 可以将适用最短路的算法分为单源最短路,和多源最短路如下图: 多源最短路算法Floyd: Floyd-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子...

sugarbliss 6513

深度解析之算法之多源BFS

多源BFS:用BFS解决边权为1的多源最短路问题解法一:暴力,将多源最短路问题转换为若干个单源最短路问题,但是肯定是会出现超时现象的解法二:把所有的源点当成一个超级源点,问题就变成了单体的单源最短路问题了。

2301_80863610的博客 6698

多源最短路和单源最短路

多源最短路 例题:[USACO08OPEN]Clear And Present Danger S #include <bits/stdc++.h> using namespace std; int n,m,a[110][110],b[10010]; int main(void) { cin>>n>>m; for(int i=1;i<=m;i++) cin>>b[i]; for(int i=1;i<

qcy的博客 570

Floyd多源最短路

详细介绍了Floyd算法在图论中的应用,这是一种基于动态规划的最短路径算法,适用于处理带负权边的图(不含负权环)。文章阐述了算法核心思想、状态定义和转移方程,并提供了C++实现代码。Floyd算法通过维护距离矩阵,以O(n³)时间复杂度计算所有顶点间最短路径。代码实现包含初始化、动态规划更新和结果输出步骤,适用于洛谷B3647题。该算法因其简单易实现,成为OI竞赛常用模版之一。

蒟蒻分享算法学习日常 857

BFS解决多源最短路问题_01矩阵_C++【含多源最短路问题介绍+dist数组介绍】

如图,红色是出发点,蓝色是终点。以前我们做的题中,出发点只有一个,所谓多源的意思就是,出发点有多个,求最短路径。当然,这种题的解题思路就是,将所有的出发点,合在一起,变成一个超级源点,直接计算从这个超级源点出发,到目标点的最短距离即可。

weixin_73870552的博客 1261

最短路

最短路 写图论的时候其实还是很怕写最短路,自己会的算法也停留在最早时候教的原始dij算法,一般比赛里dij算法过于简单见不到原题,也很久没有复习过,现在基本忘完了。趁讲课之前赶紧补救一下。 最短路定义: 最短路问题(short-path problem)是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。基本内容是:若网络中的每条边都有一个数值(长度、成本、...

X_X的博客 1890

算法魅力:BFS解决多源最短路问题

本文介绍了多源BFS算法及其在解决多源最短路问题中的应用。通过三个经典问题(01矩阵、飞地数量和地图最高点)展示了该算法的核心思想:将所有起点视为一个整体同时搜索,从而高效计算图中各点到最近源点的最短距离。文章特别强调了"正难则反"的解题思维,即从目标的反向入手,将复杂问题转化为多源BFS可解的模型。每个问题都配有清晰的实现思路和代码示例,帮助读者理解算法在具体场景中的应用方式。

先做,然后做对,最后做得更好。学习就是为了自由呀,当你学会了怎么学习,想要学什么就学什么,需要什么就学什么,你就自由了。 872
上一篇: 位运算:利用计算机的二进制计算原理进行运算的 C++ 运算符
下一篇: 扩展欧几里得算法的使用及简单证明
Aobing_peterJr
博客等级 码龄2年 128粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值