分层图最短路

lc2714

带状态的Dijkstra算法求解允许最多跳过k条边权重的最短路径

状态为(节点, 剩余跳过次数),每次转移可选择走边或跳过

typedef pair<int, int> PII;

typedef tuple<int, int, int> TIII;

class Solution {

public:

int shortestPathWithHops(int n, vector<vector<int>>& edges, int s, int d, int k) {

vector<vector<PII>> g(n);

for (auto& edge : edges) {

int a = edge[0], b = edge[1], c = edge[2];

g[a].emplace_back(b, c);

g[b].emplace_back(a, c);

}

vector<vector<int>> dist(n, vector<int>(k + 1, INT_MAX));

dist[s][0] = 0;

vector<vector<bool>> seen(n, vector<bool>(k + 1, false));

priority_queue<TIII, vector<TIII>, greater<TIII>> pq;

pq.emplace(0, s, 0);

while (!pq.empty()) {

auto [td, u, tk] = pq.top();

pq.pop();

if (seen[u][tk]) continue;

seen[u][tk] = true;

for (auto& [v, nd] : g[u]) {

if (dist[v][tk] > td + nd) {

dist[v][tk] = td + nd;

pq.emplace(td + nd, v, tk);

}

if (tk < k and dist[v][tk + 1] > td) {

dist[v][tk + 1] = td;

pq.emplace(td, v, tk + 1);

}

}

}

return *min_element(dist[d].begin(), dist[d].end());

}

};

相关推荐
2301_7765087233 分钟前
C++与机器学习框架
开发语言·c++·算法
Albertbreak38 分钟前
STL容器内部实现剖析
开发语言·c++·算法
CoovallyAIHub41 分钟前
AAAI 2026 | AnoStyler:文本驱动风格迁移实现零样本异常图像生成,轻量高效(附代码)
算法·架构·github
2301_7957417941 分钟前
模板编译期机器学习
开发语言·c++·算法
CoovallyAIHub43 分钟前
500M参数就能跑视觉语言模型?Moondream把VLM塞进了边缘设备
算法·架构·github
qq_416018721 小时前
模板错误消息优化
开发语言·c++·算法
We་ct1 小时前
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置:二分查找实战
前端·算法·leetcode·typescript·二分
Sunshine for you1 小时前
C++中的对象池模式
开发语言·c++·算法
炽烈小老头1 小时前
【 每天学习一点算法 2026/03/25】在排序数组中查找元素的第一个和最后一个位置
学习·算法
刀法如飞1 小时前
AI时代,重温10大经典排序算法的思维
算法·排序算法·ai编程