[AcWing 853] 有边数限制的最短路

image


点击查看代码
#include<iostream>
#include<cstring>

using namespace std;
const int N = 510, M = 1e5 + 10;
int n, m, k;
int dist[N], last[N];
struct Edge {
	int a, b, c;
}edges[M];
void bellman_ford()
{
	memset(dist, 0x3f, sizeof(dist));
	dist[1] = 0;
	for (int i = 0; i < k; i ++) {
		memcpy(last, dist, sizeof(dist));
		for (int j = 0; j < m; j ++) {
			auto e = edges[j];
			dist[e.b] = min(dist[e.b], last[e.a] + e.c);
		}
	}
}
int main()
{
	cin >> n >> m >> k;
	for (int i = 0; i < m; i ++) {
		int a, b, c;
		cin >> a >> b >> c;
		edges[i] = {a, b, c};
	}
	bellman_ford();
	if (dist[n] > 0x3f3f3f3f / 2)	puts("impossible");
	else	cout << dist[n] << endl;
	return 0; 
}

  1. bellman_ford 算法主要用于在边数有限制的条件下求最短路;(可以有负权回路)
  2. dist[ i ] 用来存 1 号点到 i 号点的距离,last 的作用是做一个备份,以免发生串联现象;(串联现象是指,1 -> 2 -> 3 有路径,那么如果在一轮更新中,提前更新了 1 -> 2,会影响到 1 -> 3 的更新,1 -> 3 本轮的更新应该用上一轮结束的 1 -> 2)
  3. 最后判断是否存在的条件,是用 0x3f3f3f3f / 2,而不用 0x3f3f3f3f,是因为如果存在两个走不到的节点(即 1 到这两个点的 dist 都是 0x3f3f3f3f),而这两个节点之间存在一条负值边,那么其中一个节点的 dist 就会更新为比 0x3f3f3f3f 小一点的值,取 0x3f3f3f3f / 2 可以避免负值边的这种情况;
  4. Edge 中 a, b, c 的含义是存在从 a 到 b 的一条权值为 c 的边;
posted @   wKingYu  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 853] 有边数限制的最短路』
点击右上角即可分享
微信分享提示