当前位置: 首页 > news >正文

Codeforces 1473E Minimum Path 题解 [ 蓝 ] [ 分层图最短路 ] [ 贪心 ] [ 构造 ]

Minimum Path

神仙分层图题。

不要考虑原式的实际含义,我们直接对整个式子考虑,设 \(e_{\max}\) 为最大边,\(e_{\min}\) 为最小边:

\[\sum\limits_{i=1}^{k}{w_{e_i}} - \max\limits_{i=1}^{k}{w_{e_i}} + \min\limits_{i=1}^{k}{w_{e_i}} = \sum\limits_{i=1, e_i\ne e_{\max}, e_i\ne e_{\min}}^{k}w_{e_i} + 2 \min\limits_{i=1}^{k}{w_{e_i}} \]

容易发现我们把最大边的权值乘了一个 \(0\) 的系数,而把最小边的权值乘了一个 \(2\) 的系数。

发现当我们强制要求一定要有一条边权值乘 \(\bm 0\),另一条边权值乘 \(\bm 2\),求最短路的时候。我们乘 \(0\) 的一定是最大边,乘 \(2\) 的一定是最小边。

因此考虑建四层分层图

  • 第一层:没有乘 \(0, 2\)
  • 第二层:只乘了 \(0\)
  • 第三层:只乘了 \(2\)
  • 第四层:\(0, 2\) 都乘过了。

跑最短路即可。时间复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
using pl = pair<ll, int>;
const int N = 800005;
int n, m;
int getid(int x, int id)
{return (id * n + x);
}
vector<pi> g[N];
void add(int u, int v, int w)
{g[u].push_back({v, w});
}
void addeg(int u, int v, int w)
{g[u].push_back({v, w});g[v].push_back({u, w});
}
ll dis[N];
priority_queue<pl, vector<pl>, greater<pl> > q;
bitset<N> vis;
void Dijkstra()
{memset(dis, 0x3f, sizeof(dis));dis[getid(1, 0)] = 0;q.push({0, getid(1, 0)});while(!q.empty()){pl tmp = q.top();q.pop();int u = tmp.se;if(vis[u]) continue;vis[u] = 1;for(auto eg : g[u]){int v = eg.fi, w = eg.se;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;q.push({dis[v], v});}}}
}
int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for(int i = 1; i <= m; i++){int u, v, w;cin >> u >> v >> w;addeg(getid(u, 0), getid(v, 0), w);addeg(getid(u, 1), getid(v, 1), w);addeg(getid(u, 2), getid(v, 2), w);addeg(getid(u, 3), getid(v, 3), w);add(getid(u, 0), getid(v, 1), 0);add(getid(v, 0), getid(u, 1), 0);add(getid(u, 2), getid(v, 3), 0);add(getid(v, 2), getid(u, 3), 0);add(getid(u, 0), getid(v, 2), 2 * w);add(getid(v, 0), getid(u, 2), 2 * w);add(getid(u, 1), getid(v, 3), 2 * w);add(getid(v, 1), getid(u, 3), 2 * w);        add(getid(u, 0), getid(v, 3), w);add(getid(v, 0), getid(u, 3), w);}Dijkstra();for(int i = 2; i <= n; i++) cout << dis[getid(i, 3)] << " ";return 0;
}
http://www.rkmt.cn/news/59484.html

相关文章:

  • 2025年11月四川软电线/硬芯线/家装电线/铝合金电缆/铝芯电缆/铜芯/高压/中压/低压电线电缆供应厂家综合推荐指南:五大优质厂商深度解析
  • 2025防爆空调品牌厂家推荐:守护危险环境的安全温控选择
  • 2025精选起重机厂家推荐
  • 告别选择困难!2025金刚石修正轮厂家精选
  • 局域网 VS2022 远程调试记录
  • 周作业 45
  • 106_尚硅谷_continue课堂练习
  • 代码随想录Day20——二叉树
  • CF2157B Expansion Plan 2 - Link
  • 2025水肥一体机哪个厂家好及水肥一体机厂家联系方式汇总
  • 2025无缝焊接窗用高温隔热条哪家好?实力厂家优势解析
  • 2025门窗定制推荐厂家-金华质量好的门窗厂家推荐
  • 2025电抗器厂家推荐,进出线电抗器厂家精选盘点
  • 2025矿山机厂家推荐,精选矿山开采设备厂家推荐
  • Ubuntu 22.04 扩展 swap 内存从 2GB 到 16GB(开机自动生效)
  • 经典 DP 问题与状态定义大全
  • DP问题如何确定dp数组的定义以及如何推导状态转移方程?
  • Java高效开发实战:10个让代码质量飙升的黄金法则
  • 11月24日
  • 动态=静态(转化思想,类似扫描线)
  • 抖音投流健康领域领航者——苏州诊途赋能品牌全域增长 - langchain
  • 程序人生必读:如何通过读书会提升工艺深度与广度
  • 效率与安全的双引擎:聚焦合同管理中的印章文识别技术
  • 新露谷物语-新手指南:
  • ddddocr: 滑块验证码的一个例子
  • 恢复Windows图片查看器
  • B2B企业必看:2025年5家TOB场景GEO服务商深度测评
  • UFS简介
  • 上海高温炉品牌推荐:聚焦行业技术与服务实力
  • 北京婚姻律师事务所推荐:如何选择专业婚姻家事法律服务机构