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

【Bellman负环】Cycle Finding

题目翻译

给定一个有向图,你的任务是判断它是否包含负环,并给出这样一个环的示例。

输入
第一行输入两个整数 n 和 m:分别表示节点数和边数。节点编号为 1, 2, ..., n。
接下来 m 行描述边,每行有三个整数 a, b, c:表示存在一条从节点 a 到节点 b 的边,长度为 c。图中可能存在自环。

约束条件

  • 1 ≤ n ≤ 2500
  • 1 ≤ m ≤ 5000
  • 1 ≤ a, b ≤ n
  • -10⁹ ≤ c ≤ 10⁹

输出
如果图包含负环,先输出 "YES",然后按正确顺序输出环中的节点。如果存在多个负环,输出任意一个即可。如果没有负环,输出 "NO"。

样例输入

复制

4 5
1 2 1
2 4 1
3 1 1
4 1 -3
4 3 -2
样例输出

复制

YES
1 2 4 1

1. dis 初始化为0(寻找负环)

2. 寻找路径

Bellman-Ford 算法检测负环的逻辑是:若第 n 次松弛(即对所有边再做一次松弛操作)仍能更新某个节点的距离,则说明存在负环

这里被更新的节点res可能有两种情况:

  1. res本身就在负环上;

  2. res不在负环上,但存在一条从负环指向res的路径(即负环的 “下游”)。因为负环可以无限降低路径权重,所以res的距离能被不断更新。

  • 由于负环的长度最多为n,回溯n次后,p必然会落入负环内部(无论res最初是否在负环上)。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int n,m;int main()
{cin>>n>>m;vector<tuple<int,int,int>>adj;for(int i=0;i<m;++i){int a,b,c;cin>>a>>b>>c;adj.emplace_back(a,b,c);}vector<ll>dis(n+1,0);vector<int>pre(n+1,-1);int res=-1;for(int i=0;i<n;++i){res=-1;for(auto [a,b,c]:adj){if(dis[a]+c<dis[b]){dis[b]=dis[a]+c;pre[b]=a;res=b;}}}if(res==-1){cout<<"NO";return 0;}cout<<"YES\n";int p=res;for(int i=0;i<n;++i){p=pre[p];}int start=p;p=pre[p];vector<int>path;path.push_back(start);while(p!=start){path.push_back(p);p=pre[p];}path.push_back(start);reverse(path.begin(),path.end());for(auto i:path)cout<<i<<" ";return 0;
}

http://www.lryc.cn/news/614136.html

相关文章:

  • 遥测自跟踪天线系统组成、特点、功能、工作流程
  • 降低程序运行时CPU和GPU峰值占用的技术方案
  • ADB 命令执行模块开发:双模式(普通模式Shell交互模式)实现、线程安全与资源管理优化
  • 机器学习——支持向量机(SVM)实战案例
  • Android 中解决 Button 按钮背景色设置无效的问题
  • BGP笔记及综合实验
  • 如何在simulink中双击一个模块弹出一个exe?
  • 三防平板+天通卫星电话,打通无人之境的通信经脉
  • 前端开发:JavaScript(7)—— Web API
  • 从手工到智能决策,ERP让制造外贸企业告别“数据孤岛“降本增效
  • 生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
  • Selenium + Python + Pytest + Yaml + POM
  • ISL9V3040D3ST-F085C一款安森美 ON生产的汽车点火IGBT模块,绝缘栅双极型晶体管ISL9V3040D3ST汽车点火电路中的线圈驱动器
  • 【量子计算】量子计算驱动AI跃迁:2025年算法革命的曙光
  • 行业速览:中国新能源汽车市场格局与关键趋势
  • 时序数据库-涛思数据库
  • 实现一个进程池(精讲)
  • ​​Vue3 + Element Plus 构建的现代化即时通讯在线客服系统​
  • STM32学习笔记5-TIM定时器-1
  • 线程池基础知识
  • wstool和catkin_tools工具介绍
  • 智慧社区(十)——声明式日志记录与小区地图功能实现
  • Python实现点云PCA配准——粗配准
  • Ubuntu安装 L20显卡驱动
  • Linux网络--2、Socket编程
  • 中国电信清华:大模型驱动的具身智能发展与挑战综述
  • 动漫软件集合分享
  • Pytest项目_day08(setup、teardown前置后置操作)
  • 144.二叉树的前序遍历
  • 鲸签云解决互联网行业合同管理难题​