C++算法:多源最短路径的原理及实现

简介: C++算法:多源最短路径的原理及实现

时间复杂度

O(n3),n是端点数。

核心代码

template<class T, T INF = 1000 * 1000 * 1000>
class CNeiBoMat
{
public:
  CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirect=false,bool b1Base= false)
  {
    m_vMat.assign(n, vector<int>(n, INF));
    for (int i = 0; i < n; i++)
    {
      m_vMat[i][i] = 0;
    }
    for (const auto& v : edges)
    {
      m_vMat[v[0]- b1Base][v[1]- b1Base] = v[2];
      if (!bDirect)
      {
        m_vMat[v[1]- b1Base][v[0]- b1Base] = v[2];
      }
    }
  }
  vector<vector<int>> m_vMat;
};
//多源码路径
template<class T,T INF = 1000*1000*1000>
class CFloyd
{
public:
  CFloyd(const  vector<vector<T>>& mat)
  {
    m_vMat = mat;
    const int n = mat.size();
    for (int i = 0; i < n; i++)
    {//通过i中转
      for (int i1 = 0; i1 < n; i1++)
      {
        for (int i2 = 0; i2 < n; i2++)
        {
          //此时:m_vMat[i1][i2] 表示通过[0,i)中转的最短距离
          m_vMat[i1][i2] = min(m_vMat[i1][i2], m_vMat[i1][i] + m_vMat[i][i2]);
          //m_vMat[i1][i2] 表示通过[0,i]中转的最短距离
        }
      }
    }   
  };
  vector<vector<T>> m_vMat;
};

原理

当一层循环执行完后,m_vMat[i1][i2]表示经过[0,i)中的任意个点的最短距离。

初始状态下, m_vMat[i1][i2]表示直达的最小距离,也就是经过0个点。

通过[0,i)中任意个点,i1到i2的最短路径记为PrePathi1i2,通过[0,i+1)中任意个点,i1到i2的距离的路径为Pathi1i2,如果Path不经过Pathi1i2,则和PrePathi1i2相同。如果经过则可以拆分成{i1…i}+{i…i2},显然{i1…i}是PrePathi1i,{i…i2}是PrePathii2,否则替换成PrePathi1i和PrePathii2。

m_vMat同时表示PreMath和Math,如果m_vMat[i1][i]或m_vMat[i][i2]已经更新,会带来错误的结果么?结果是不会,会更新但值不变。

当i1等于i时:

m_vMat[i][i2] = min(…, m_vMat[i][i] + m_vMat[i][i2]);

由于m_vMat[i][i]为0,所以右式就是左式。

当i2等于i时,类似。

样例

 

假定有5个点,前4个点连通。整个处理流程如下:

初始状态

处理完i等于0(不变)

0

1

4

INF

INF

1

0

2

4

INF

4

2

0

3

INF

INF

4

3

0

INF

INF

INF

INF

INF

0

处理完i等于1

处理完i等于2(不变)

3

5

3

5

处理完i等于3,结果不变

最终结果

0

1

3

5

INF

1

0

2

4

INF

3

2

0

3

INF

5

4

3

0

INF

INF

INF

INF

INF

0

测试样例

#include <vector>
#include<assert.h>
using namespace std;
struct CDebugParam
{
    int n;
    vector<vector<int>> edges;
    vector<vector<int>> result;
};
int main()
{
    const int INF = 1000 * 1000 * 1000;
    vector<CDebugParam> params = { {5,{{0,1,1},{0,2,4},{1,2,2},{1,3,4},{2,3,3}},
        {
            {0,1,3,5,INF},
            {1,0,2,4,INF},
            {3,2,0,3,INF},
            {5,4,3,0,INF},
            {INF,INF,INF,INF,0}
        }
        } };
    for (const auto& param : params)
    {
        CNeiBoMat<int> mo(param.n, param.edges);
        CFloyd<int> floyd(mo.m_vMat);
        for (int r = 0; r < param.n; r++)
        {
            for (int c = 0; c < param.n; c++)
            {
                assert(param.result[r][c] == floyd.m_vMat[r][c]);
            }
        }
    }
}

其它

源码及测试样例下载

https://download.csdn.net/download/he_zhidan/88393631


其它

视频课程

基础算法的C++实现课程,请点击下面的CSDN学院的链接。

https://edu.csdn.net/course/detail/38771

我还做了其它课程,比如:C++入职培训,C#入职培训。

https://edu.csdn.net/lecturer/6176

运行验证环境

Win10 VS2022 Ck++17 或win7 VS2019 C++17

相关下载

如果你时间宝贵,只想看精华,请到CSDN下载频道下载《闻缺陷则喜算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
54 3
|
1月前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
18天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
42 3
|
23天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
1月前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
1月前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
45 4
|
1月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
78 3
|
23天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
2月前
|
算法 数据库 索引
HyperLogLog算法的原理是什么
【10月更文挑战第19天】HyperLogLog算法的原理是什么
98 1
|
2月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
下一篇
DataWorks