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

Bellman-Ford

 思路

  • 外层遍历V-1次
  • 内层遍历所有边(共E次),尝试更新起点的终点的dist值
    • 原材料是backup(前次遍历的结果)
    • 维持住性质(见下)

优点

允许负环

允许负权边

有特殊性质

缺点

复杂度达到O(VE)

例题

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 510, M = 1e4+10;
const int inf = 0x3f3f3f3f;
struct edge{
    int a;
    int b;
    int c;
} e[M];
int n, m, k;
int dist[N], backup[N];
int Bellman()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    
    for(int i = 0; i < k; i++) //要保持k次遍历有“路径的边数不超过k”的性质,需要backup
    {
        memcpy(backup, dist, sizeof dist);
        for(int j = 0; j < m; j++)
        {
            int a = e[j].a, b = e[j].b, c = e[j].c;
            if(dist[b] > backup[a] + c)
                dist[b] = backup[a] + c; //backup是原材料(<=k-1),dist是最优的结果(<=k),当前的最优结果是下次的材料
        }
    }
    
    if(dist[n] > inf / 2) return inf;
    else return dist[n];
}
int main()
{
    cin >> n >> m >> k;
    for(int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        e[i] = {a, b, c};
    }
    int t = Bellman();
    if(t == inf) cout << "impossible";
    else cout << t;
}


http://www.kler.cn/a/350416.html

相关文章:

  • 平稳随机信号的频域表达
  • 3DCAT实时云渲染赋能2024广东旅博会智慧文旅元宇宙体验馆上线!
  • FreeRTOS应用开发学习
  • qt 10.10作业
  • STM32—SPI通讯协议
  • Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题
  • 华为OD机试 - 小朋友分组最少调整次数 - 贪心算法(Python/JS/C/C++ 2024 E卷 100分)
  • 讲一讲Redis五大数据类型的底层实现
  • libaom 源码分析:aomdec.c 文件
  • mac 桌面版docker no space left on device
  • PostgreSQL AUTO INCREMENT
  • Qt 如何 发送与解析不定长报文以及数组不定长报文
  • AUTOSAR CP, WdgM如何进行执行顺序监督的
  • Ubuntu 22.04 配置禁止密码登录,只允许密钥登录
  • 《深度学习》LSTM 长短期记忆网络 结构及原理解析
  • Redis学习笔记:跳跃表
  • nn.functional.softmax(X, dim=-1)
  • Visual Studio 2022常用快捷键
  • Elastisearch查询最近一年消费金额排名前五的用户
  • Jmeter脚本录制、Badboy脚本录制