AcWing853 有边数限制的最短路(最短路、k短路、Bellman-Ford)

题目:AcWing853 有边数限制的最短路


前言

解决有负权边的最短路问题可以用Bellman-Ford算法,特别是可以解决最多经过k条边的最短路问题。

一、题目陈述

在这里插入图片描述

二、解决思路

1.迭代k

每次遍历所有的边进行更新。

2.利用backup数组

解决如下的串联问题:
如果不使用backup数组,且k为1,先枚举边1->2,后枚举边2->3,则dist[3]会被更新为2,但是此时超过了k为1的限制,会出现错误。
在这里插入图片描述

3.0x3f3f3f3f/2

因为可能会出现以下情况:
在这里插入图片描述
此时n号点距离1号点的距离为正无穷大-2 < 正无穷,如果不使用0x3f3f3f3f/2,会被错误地判定为可达。

三、代码实现

#include<iostream>
#include<cstring>
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;
	// 迭代k次
	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() {
	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("impossible");
	else cout<<t<<endl;
	return 0;
} 

总结

Bellman-Ford算法是一个比较傻的算法,但是这种情况下(求k短路问题+存在负权变)不得不用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codertea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值