尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

洛谷 P1967 [NOIP 2013 提高组] 货车运输 题解
📅 发布时间:2026/6/22 12:14:37
洛谷 P1967 [NOIP 2013 提高组] 货车运输 题解

原题链接:货车运输

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;
}

相关新闻

  • 【每日一问】示波器探头校准技巧和校准原理是什么?
  • 向量数据库 FAISS、LanceDB 和 Milvus
  • ms sql dml 操作

最新新闻

  • React 状态管理:从“全局仓库“到“就近原则“的架构演进
  • 开咖啡馆选什么咖啡机?从半自动到全自动,2026年商用咖啡机选型深度观察 - 商业科技观察
  • 2026年北京印刷供应厂家怎么选?廊坊佰利得印刷有限公司综合实力解析 - 品牌鉴赏官2026
  • 2026年新消息:如何甄别并选择真正靠谱的一氧化碳催化剂优质厂商 - 品牌鉴赏官2026
  • 大模型核心技术全解析:从预训练到AI Agent,算力开销与落地场景大公开!
  • (2026最新)北京防水补漏正规公司甄选推荐:漏水检测维修-暗管漏水精准定位检测漏水点-卫生间/厨房/屋顶/阳台/渗漏水维修-本地人必选的正规测漏公司 - 即刻修防水

日新闻

  • Arduino-ESP32项目深度解析:解锁隐藏芯片支持与架构演进
  • 2026年 系统窗厂家/品牌推荐榜单:隔音系统窗+高端系统门窗的核心优势与选购指南 - 品牌发掘
  • NVBench:首个双语非言语发声语音合成评测基准详解与实践

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号