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

最短路 - BellFord算法

有边数限制,存在负权边

题目描述

给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。
请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible.
注意:图中可能 存在负权回路。
输入格式
第一行包含三个整数n,m,k。
接下来m行,每行包含三个整数x,y,z,表示点x和点y之间存在一有向边长为z。
输出格式
输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离。
如果不存在满足条件的路径,则输出“impossible”。
数据范围
1 ≤n,k≤ 500,
1<m< 10000.
任意边长的绝对值不超过10000。

样例输入:

3 3 1
1 2 1
2 3 1
1 3 3

样例输出:

3

// 最短路 - Bellman_Ford算法
// 存在负权边,有边数限制时
// 有负权回路最短路不一定存在
// 单源最短路算法 从 1 号点到其它点的距离#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=510,M=10010;
int n,m,k;
int dist[N],backup[N];struct Edge
{int a,b,w;
} edges[M] ;int bellman_ford()
{memset(dist,0x3f,sizeof dist);dist[1]=0;//从 1 号点经过不超过 k 条边到 n 号点最短路的距离for(int i=0;i<k;i++){memcpy(backup,dist,sizeof dist);for(int j=0;j<m;j++){int a=edges[j].a,b=edges[j].b,w=edges[j].w;dist[b]=min(dist[b],backup[a]+w);}}if(dist[n]>0x3f3f3f3f/2) return -1;return dist[n];
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>k;for(int i=0;i<m;i++){int a,b,w;cin>>a>>b>>w;edges[i]={a,b,w};}int t=bellman_ford();if(t==-1) puts("impossable");else cout<<t<<endl;return 0;
}


http://www.mrgr.cn/news/13323.html

相关文章:

  • 常见拓扑结构的工作原理
  • 抽奖系统PHP源码开源二开版带完整后台
  • 从繁荣到衰退:资本周期如何影响投资回报?-《资本回报》读后感
  • 免费分享:2018中国光伏发电潜力长期年平均值数据(附下载方法)
  • Mirai僵尸网络新漏洞:双刃剑效应下的DDoS攻防战
  • 贪心算法---加油站
  • 基于SSM+小程序的智慧旅游平台登录管理系统(旅游2)(源码+sql脚本+视频导入教程+文档)
  • 【xilinx】学习ZynqSOC发现教程和vitis2023版本界面对不上
  • C# 泛型约束
  • webpack和vite分别是什么,优势
  • 学习区块链?看我就够了!
  • MySQL索引(三)
  • 重装后的电脑怎么分区?轻松优化存储空间
  • 【苍穹外卖】Day2 员工接口 分类接口
  • BERT模型
  • C++语法基础(一)
  • 无人机 PX4 飞控 | ROS应用层开发:指令(字符串)订阅功能
  • 新增页面保存后,跳转为详情页,同时关闭新增页。(即路由detail/1?type=1,变为detail/2/2?type=2id=2)
  • Go学习笔记(一)语法
  • GNU/Linux - RSYSLOG