分层图最短路

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());

}

};

相关推荐
寻寻觅觅☆14 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子15 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
化学在逃硬闯CS15 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar12316 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS16 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗16 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
忙什么果17 小时前
上位机、下位机、FPGA、算法放在哪层合适?
算法·fpga开发
董董灿是个攻城狮17 小时前
AI 视觉连载4:YUV 的图像表示
算法
ArturiaZ18 小时前
【day24】
c++·算法·图论
大江东去浪淘尽千古风流人物18 小时前
【SLAM】Hydra-Foundations 层次化空间感知:机器人如何像人类一样理解3D环境
深度学习·算法·3d·机器人·概率论·slam