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

洛谷 P1967 [NOIP 2013 提高组] 货车运输(kruskal 重构树 + 求路径最小边权)

题目链接

题目难度

洛谷上是蓝题,本人认为评高了,此题思维和实现都不难,应该是绿题。

题目解法概括

kruskal 重构树 + 倍增优化求路径最小边权

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;typedef long long LL;const LL Maxn = 1e4 + 5;
const LL Maxm = 5 * 1e4 + 5;
const LL Maxk = 20;
const LL Inf = 1e18;struct node {LL x, y, z;
} Edge[Maxm];struct node2 {LL to, e;
};
vector<node2> tree[Maxn];LL bfa[Maxn], father[Maxn][Maxk], depth[Maxn], minDis[Maxn][Maxk];
bool vis[Maxn];void init_bfa(LL n) {for (LL i = 0; i <= n; ++i)  bfa[i] = i;return;
}LL f_find(LL x) {if (x == bfa[x])  return x;else  return bfa[x] = f_find(bfa[x]);
}bool f_join(LL u, LL v) {u = f_find(u);v = f_find(v);if (u == v)  return false;bfa[u] = v;return true;
}void dfs(LL u, LL fa) {vis[u] = true;father[u][0] = fa;depth[u] = depth[fa] + 1;for (LL i = 1; depth[u] > (1 << i); ++i) {father[u][i] = father[father[u][i - 1]][i - 1];minDis[u][i] = min(minDis[u][i - 1], minDis[father[u][i - 1]][i - 1]);}for (auto elem : tree[u]) {if (elem.to == fa)  continue;minDis[elem.to][0] = elem.e;dfs(elem.to, u);}return;
}LL path_num(LL u, LL v) {if (depth[u] < depth[v])  swap(u, v);LL res = Inf;for (LL i = Maxk - 1; i >= 0; --i) {if (depth[father[u][i]] >= depth[v]) {res = min(res, minDis[u][i]);u = father[u][i];}}if (u == v)  return res;for (LL i = Maxk - 1; i >= 0; --i) {if (father[u][i] != father[v][i]) {res = min(res, min(minDis[u][i], minDis[v][i]));u = father[u][i];v = father[v][i];}}if (father[u][0] == 0)  return -1;else {res = min(res, min(minDis[u][0], minDis[v][0]));return res;}
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);LL n, m, q, a, b;cin >> n >> m;for (LL i = 1; i <= m; ++i) {cin >> Edge[i].x >> Edge[i].y >> Edge[i].z;}sort(Edge + 1, Edge + m + 1, [](const node& a, const node& b) {return a.z > b.z;});init_bfa(n);for (LL i = 1; i <= m; ++i) {if (f_join(Edge[i].x, Edge[i].y) != false) {tree[Edge[i].x].push_back({Edge[i].y, Edge[i].z});tree[Edge[i].y].push_back({Edge[i].x, Edge[i].z});}}for (LL i = 1; i <= n; ++i) {if (vis[i] == false)  dfs(i, 0);}cin >> q;while (q--) {cin >> a >> b;cout << path_num(a, b) << '\n';}return 0;
}

总结

只考虑和结果有关的部分,是此题的突破点,也是重要的思维方式。

解法

若 x 到 y 有多条路径,只需考虑最小边权最大的路径,直接找这样的路径,比较费时,可以考虑直接去掉无用的路径,那么用 kruskal 重构树构建最大瓶颈树。我们只考虑和结果有关的部分。

此时,问题就变成了树上的求路径的最小边权问题,需要求 LCA,求 LCA 和求路径的最小边权可以同步进行。


文章转载自:

http://uSMPZm2V.jwtwf.cn
http://9QkiRnkR.jwtwf.cn
http://bAPTtSwA.jwtwf.cn
http://zj0ez6bH.jwtwf.cn
http://gn9Qu4Hq.jwtwf.cn
http://87qkEtuf.jwtwf.cn
http://s9ktXLL4.jwtwf.cn
http://Au9wqkdx.jwtwf.cn
http://ShpH3KLx.jwtwf.cn
http://GWyOyfnH.jwtwf.cn
http://dU8hX3Vz.jwtwf.cn
http://DLf5ec2w.jwtwf.cn
http://J8aXg2HM.jwtwf.cn
http://rc0SDqpA.jwtwf.cn
http://2xveIr1L.jwtwf.cn
http://3pY1cAJd.jwtwf.cn
http://datr7KxA.jwtwf.cn
http://2e5nznx1.jwtwf.cn
http://YHCVhlMt.jwtwf.cn
http://LtctWR60.jwtwf.cn
http://qcVoH3oR.jwtwf.cn
http://kAhBDOZH.jwtwf.cn
http://JMGTEDCR.jwtwf.cn
http://vyF8gNAc.jwtwf.cn
http://b8SJ3vKg.jwtwf.cn
http://sG3sbvQ5.jwtwf.cn
http://asshNUsA.jwtwf.cn
http://nyNEEBSq.jwtwf.cn
http://JzcEgDbX.jwtwf.cn
http://8cMu3CBZ.jwtwf.cn
http://www.dtcms.com/a/378441.html

相关文章:

  • android 如何判定底部导航栏显示时 不是键盘显示
  • Django入门笔记
  • 中悦大华通过订单日记实现流程重构之路
  • 电波之外:socket套接字,Linux下UDP通信的孤独诗篇
  • 自动驾驶中的传感器技术44——Radar(5)
  • Linux常用命令之top:动态进程排查利器
  • 【Problem】动态规划之跳跃游戏系列
  • Android 相机框架的跨进程通信架构
  • 从零实现成绩管理系统:深入理解 Python 类方法、静态方法和属性封装
  • G1 垃圾收集器深入解析
  • 【Leetcode hot 100】104.二叉树的深度
  • nginx的基础使用
  • AWS 查询 ALB access log
  • 认知语义学对人工智能自然语言处理深层语义分析的影响与启示
  • iText与OpenPDF使用差异及中文处理完全指南
  • 动态规划算法的欢乐密码(五):子数组系列(上)
  • 【国内电子数据取证厂商龙信科技】浅析文件头和文件尾和隐写
  • Gradio全解11——Streaming:流式传输的视频应用(8)——Gemini Live API:实时音视频连接
  • [特殊字符] 玩转 Python 命令行参数:从 `-m` 到 `argparse` 的全攻略
  • [免费]基于Python的Django医院管理系统【论文+源码+SQL脚本】
  • 【音视频】Android NDK 与.so库适配
  • 认识鸿蒙——它不是“安卓换皮”
  • YOLO11目标检测运行推理简约GUI界面
  • 如何在 VSCode 中设置默认浏览器为 Chrome 或 Firefox
  • VSCode设置:解决找不到文件的问题
  • rabbitmq的安装
  • 从拓扑排序看有向图的应用
  • 谷歌浏览器
  • openCV 角点检测与 SIFT 特征提取:原理与实战解析
  • 使用Samba网络磁盘作为MacOS时间机器的远程备份磁盘