分层图最短路

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

}

};

相关推荐
水云桐程序员18 小时前
C语言编程基础,输入与输出
c语言·开发语言·算法
ZPC821018 小时前
MoveIt Servo 与自己编写的 Action Server 通信
人工智能·算法·机器人
jllllyuz18 小时前
采用核函数的极限学习机(KELM)MATLAB实现
算法
apcipot_rain18 小时前
【天梯赛】2026天梯赛模拟赛——题解
开发语言·c++·算法·蓝桥杯·天梯赛
.柒宇.19 小时前
力扣hot100之最大子数组和(Java版)
数据结构·算法·leetcode
黎阳之光19 小时前
非视距·自愈·广覆盖|黎阳之光1.4&5.8GHz宽带自愈网无线基站,重构工业级无线通信
大数据·人工智能·算法·安全·数字孪生
llilian_1619 小时前
铷原子频率标准 以时频基准破局,为计量校准赋能 时基铷钟
网络·功能测试·单片机·嵌入式硬件·测试工具·算法
6Hzlia19 小时前
【Hot 100 刷题计划】 LeetCode 131. 分割回文串 | C++ 回溯算法基础切割法
c++·算法·leetcode
美式请加冰19 小时前
子序列问题
数据结构·算法·leetcode
DeniuHe19 小时前
线性回归与逻辑回归:同为凸函数,为何一个有解析解、一个没有?
算法·机器学习·逻辑回归