本文使用了ai辅助,旨在更好的帮助大家理解一些技巧
邮递员送信_牛客题霸_牛客网
以这一题为例,需要对节点 1 求 两次 dijkstra,怎么使得代码写的简洁?
ac 代码如下,我们来一一解析:
[code]void solve(){ int n(q_), m(q_); using ED = array; using GRAPH = vector; GRAPH tr(n + 1); GRAPH rtr(n + 1); ffp(i, 1, m) { int u(q_), v(q_), w(q_); tr.push_back({ w,v });//tr是树边,本人的习惯 rtr[v].push_back({ w,u });//rtr是反图 } auto dij = [&](int st, GRAPH& gp)->ll { priority_queuedui; vectordis(n + 1, iINF); dis[st] = 0; dui.push({ 0,st }); while (dui.size()) { auto [w, now] = dui.top(); dui.pop(); if (dis[now] < w)continue; for (auto [nxtw, nxt] : gp[now]) { if (nxtw + dis[now] >= dis[nxt])continue; dis[nxt] = nxtw + dis[now]; dui.push({ nxtw + dis[now],nxt }); } } return accumulate(dis.begin() + 1, dis.end(), 0ll); }; cout |