bellman_ford(限制边数的最短路)

853. 有边数限制的最短路


给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible

注意:图中可能存在负权回路

输入格式

第一行包含三个整数 n,m,k

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z

输出格式

输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。

如果不存在满足条件的路径,则输出 impossible

数据范围

1n,k500,
1m10000,
任意边长的绝对值不超过 10000

输入样例:

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

输出样例:

3
  • 时间复杂度:O(nm)

代码

#include<bits/stdc++.h> using namespace std; int n,k,m; struct Edge { int l,r,w; }edges[10005]; int d[505],backup[505]; void bellman_ford() { memset(d,0x3f,sizeof d); d[1]=0; for(int i=0;i<k;i++) { memcpy(backup,d,sizeof d); for(int i=1;i<=m;i++) { auto [l,r,w]=edges[i]; d[r]=min(d[r],backup[l]+w); } } } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++)scanf("%d%d%d",&edges[i].l,&edges[i].r,&edges[i].w); bellman_ford(); if(d[n]>0x3f3f3f3f/2)puts("impossible"); else printf("%d",d[n]); return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15552872.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示