洛谷 P1967 [NOIP 2013 提高组] 货车运输 题解

news/2025/9/18 11:42:26/文章来源:https://www.cnblogs.com/TTC84/p/19098435

原题链接:货车运输

kruskal重构树+LCA做法,树剖不想写
很容易发现原图跑最短路可以解,但是复杂度难以承受,所以考虑如何简化该图。
发现原图边权维护的应该是(u,v)的最小值,并且最优选择是这个最小值最大,所以如果有多条(u,v),只保留最大的没有影响,如果我们维护一棵最大生成树就一定包含(u,v)的最优解。这一部分可以用kruskal重构树。

然后考虑对于这棵树,如何求(u,v)路径上的最小值。
对于一棵树(u,v)是确定的唯一路径,我们可以发现可以把(u,v)拆成两条从LCA(u,v)到u和v的链,最后对它们取min。暴力的做法可以从u,分别上跳直到找到LCA(u,v),时间复杂度O(n),难以承受,所以用倍增LCA,同时维护一个数组st,st[i][j]表示i节点到i的2j辈祖宗节点这条链的min,我们在求min((i,LCA))时,发现可以通过类似LCA算法中将x,y深度拉平的方法,不断上跳使i逼近LCA,期间用每一条短链更新答案,最终求出min((i,LCA)),最后合并两条链答案即可。时间复杂度O(nlogn),可以接受。

AC代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int const N=1e4+10,M=5e4+10;
int p[N];
struct node{int u,v;int w;bool flag;
}tree[M];
int h[N],nx[M],to[M],vl[M],idx=1;
int n,m;
int deep[N],st[N][21],anst[N][21];bool cmp(node a,node b)
{return a.w>b.w;
}int find(int x)
{if(p[x]==x) return x;p[x]=find(p[x]);return p[x];
}void kruskal(){for(int i=1;i<=n;i++) p[i]=i;sort(tree+1,tree+m+1,cmp);for(int i=1;i<=m;i++){int u=tree[i].u,v=tree[i].v;int root1=find(u),root2=find(v);if(root1!=root2){p[root1]=root2;tree[i].flag=1;}}
}inline void add(int u,int v,int w)
{to[idx]=v;nx[idx]=h[u];vl[idx]=w;h[u]=idx++;
}void dfs(int u,int fa)
{if(u==0) anst[u][0]=0;else anst[u][0]=fa;if(u==0) deep[u]=0;else deep[u]=deep[fa]+1;for(int i=h[u];i;i=nx[i]){int v=to[i],w=vl[i];if(v==fa) continue;st[v][0]=w;dfs(v,u);}
}void first()
{for(int j=1;(1<<j)<=n;j++){for(int i=1;i<=n;i++){anst[i][j]=anst[anst[i][j-1]][j-1];}}
}int lca(int x,int y)
{if(deep[x]<deep[y]) swap(x,y);int d=deep[x]-deep[y];for(int i=0;(1<<i)<=d;i++){if((1<<i) & d)x=anst[x][i];}if(x==y) return x;for(int i=20;i>=0;i--){if(anst[x][i]!=anst[y][i]){x=anst[x][i];y=anst[y][i];}if(anst[x][0]==anst[y][0]) break;}return anst[x][0];
}void RMQ()
{for(int j=1;(1<<j)<=n;j++){for(int i=1;i<=n;i++){st[i][j]=min(st[i][j-1],st[anst[i][j-1]][j-1]);}}
}int check(int fa,int v)
{int d=deep[v]-deep[fa];int mn=INT_MAX;for(int j=0;(1<<j)<=d;j++){if((1<<j) & d){mn=min(mn,st[v][j]);v=anst[v][j];}}return mn;
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);tree[i].u=u;tree[i].v=v;tree[i].w=w;}kruskal();for(int i=1;i<=m;i++){if(!tree[i].flag) continue;int u=tree[i].u,v=tree[i].v,w=tree[i].w;add(u,v,w);add(v,u,w);}for(int i=1;i<=n;i++){if(p[i]==i) add(0,i,0);}dfs(0,-1);first();RMQ();int q;scanf("%d",&q);for(int i=1;i<=q;i++){int x,y;scanf("%d%d",&x,&y);int fa=lca(x,y);if(fa==0) cout<<-1<<endl;else printf("%d\n",min(check(fa,x),check(fa,y)));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:【2026计算机毕业设计】基于Springboot的婚车租赁系统

详细介绍:【2026计算机毕业设计】基于Springboot的婚车租赁系统2025-09-18 11:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

【每日一问】示波器探头校准技巧和校准原理是什么?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

审美积累 | 这样的暗色系音频播放界面怎么做?

审美积累 | 这样的暗色系音频播放界面怎么做? 收集了一些播放页,有需要的伙伴后台私信si,发高清原图一起学习~ 1. 整体视觉风格深色模式优先:黑色或深灰背景,能凸显封面、模块卡片、图标的亮色部分,视觉上更聚焦…

cherry-pick 合并曾今某一次提交

确认当前分支 git checkout test 找到要合并提交的哈希值 git log --oneline 太长的话点击q 退出 切换到我们要合并的分支 git checkout dev 使用 cherry-pick 应用指定提交 git cherry-pick <提交哈希1> 推送到…

向量数据库 FAISS、LanceDB 和 Milvus

FAISS (Facebook AI Similarity Search)本质:一个库 (Library),而不是一个数据库。定位:由 Meta (Facebook) AI 研发的、专注于高效相似性搜索的 C++/Python 库。它的核心使命只有一件事:在海量向量中快速找到最相…

Fast IO 模板

放在 using namespace std; 后面即可。 namespace fast_IO { #define FASTIO #define IOSIZE 100000char ibuf[IOSIZE], obuf[IOSIZE];char *p1 = ibuf, *p2 = ibuf, *p3 = obuf; #ifdef ONLINE_JUDGE #define getchar…

kylin V11安装mysql8.4.5(glibc.2.28版本)

环境:OS:kylin V11mysql:8.4.5 glibc2.28(建议不要安装glibc.2.17版本) 查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C) 2023 Free Software Foundation, Inc.This is free …

iOS 上架 App 流程全解析 苹果应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验

本文系统解析 iOS 上架 app 流程,涵盖苹果应用从开发者账号注册、证书准备、uni-app 打包、ipa 上传、TestFlight 测试,到 App Store 审核与发布的完整步骤,结合多工具协作,总结高效实用的上架经验。对开发者来说,…

P6801 花式围栏

题目传送门数学、计数类。题意 在 \(n\) 个同一底线上宽 \(w\),高 \(h\),给定的相邻矩形中,数出在方格上的任意形状的小矩形的个数。 \(1\leq n\leq 10^5,1\leq w,h \leq 10^9\) 题解 我们规定竖直方向上为高,水平…

ms sql dml 操作

ms sql dml 操作 --建表 select * into tablenew from tableold

黑白染色方法

主要有 \(3\) 种方法:DFS / BFS / DSUDFS直接遍历整张图染色,判断是否产生冲突 init(){for(int i=1;i<=n;i++) col[i]=-1; } bool dfs(int u,int c){col[u]=c;for(auto v:e[u]){if(col[v]==-1) return dfs(v,c^1)…

ipadװwindowsϵͳshell

如何在iPad上安装Windows系统Shell:详解与实践指南 随着科技的不断进步,用户对于设备功能的需求也在不断增加。iPad作为一款便携式的智能平板电脑,其强大的硬件性能和优秀的生态系统赢得了广大用户的喜爱。然而,对…

input 设置只输入数字或其他自定义字符 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cpu的各种寄存器及其功能

cpu的功能 指令控制 完成取指令,分析指令,执行指令的操作 操作控制 产生完成一条指令所需要的操作信号,从而控制这些部件按指令的要求正确执行 时间控制 严格控制各种操作信号出现的时间,持续时间以及出现的时间顺…

学python的第6天

学python的第6天异常处理 在pycharm中输入error查看所有异常。 1.什么是异常 1.1语法错误 1.2逻辑错误 异常的种类 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一…

如何关闭电视的ACR功能及其对隐私保护的重大意义

本文详细解析智能电视自动内容识别(ACR)技术的工作原理与隐私风险,提供三星、LG、索尼、海信、TCL五大品牌电视的ACR关闭步骤,帮助用户有效保护个人观看数据免受商业监控。如何关闭电视的ACR功能(及其重大影响) 智…

TypeScript tsconfig选项 “lib” 是做什么的

TypeScript tsconfig选项 “lib” 是做什么的TypeScript tsconfig选项 “lib” 是做什么的 在本文中,我们将介绍TypeScript的tsconfig选项 “lib” 是用来做什么的。”lib”选项可以用来指定编译器可用的JavaScript库…

12-factors

12-factors简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论:使用标准化流程自动配置,从而使新的开发者花费最少的学习成本…

huggingface 模型权重文件

文件类型文件名示例用途模型权重 pytorch_model.bin 或 model.safetensors 包含模型训练后的参数权重配置文件 config.json 包含模型架构和超参数配置词汇表文件 vocab.json, vocab.txt, tokenizer.json 分词器所需的词…

vscode设置单击选中带连字符的单词

1、打开 VSCode 设置打开设置搜索 wordSeparators,找到 Editor: Word Separators 选项。2、移除 - 字符默认值类似:`~!@#$%^&*()-=+[{]}\\|;:",.<>/?删除 -(连字符),使其变成:`~!@#$%^&*()=…