NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)
题目:
A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路。每一条道路对车辆都有重量限制,简称限重。
现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
对于每一组询问,相当于求点x到点y中所有路径中最小边权的最大值,这样就是货车的最大载重。
那么这显然可以用Kruskal重构树来解决,将重构树建成大根堆,就可以求最大边权的最小值;同理,小根堆就是最小边权的最大值。
那么做这道题就是重构树的模板题了。复杂度O(q logn)。
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=2e5+10;
4 struct edge{
5 int u,v,w;
6 bool operator < (const edge &x){
7 return w>x.w; //小根堆
8 }
9 }e[N];
10 vector<int> g[N];
11 int n,m,q,cnt,fa[N],vis[N],val[N],d[N],f[N][30];
12 int find(int x){
13 return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
14 }
15
16 void kruskal(){
17 sort(e+1,e+m+1);
18 for(int i=1;i<=n;i++) fa[i]=i;
19 for(int i=1;i<=m;i++){
20 int fu=find(e[i].u),fv=find(e[i].v);
21 if(fu!=fv){
22 val[++cnt]=e[i].w;
23 fa[cnt]=fa[fu]=fa[fv]=cnt;
24 g[cnt].push_back(fu);
25 g[cnt].push_back(fv);
26 g[fu].push_back(cnt);
27 g[fv].push_back(cnt);
28 }
29 }
30 }
31
32 void dfs(int u,int fa){
33 d[u]=d[fa]+1,f[u][0]=fa,vis[u]=1;
34 for(int i=1;(1<<i)<=d[u];i++)
35 f[u][i]=f[f[u][i-1]][i-1];
36 for(int i=0;i<g[u].size();i++){
37 int v=g[u][i];
38 if(v!=fa) dfs(v,u);
39 }
40 }
41
42 int lca(int x,int y){
43 if(d[x]<d[y]) swap(x,y);
44 for(int i=25;i>=0;i--)
45 if(d[f[x][i]]>=d[y]) x=f[x][i];
46 if(x==y) return x;
47 for(int i=25;i>=0;i--)
48 if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
49 return f[x][0];
50 }
51
52 int main(){
53 scanf("%d%d",&n,&m);
54 cnt=n;
55 for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
56 kruskal();
57 for(int i=1;i<=cnt;i++){//注意图可能是个森林,不要漏掉
58 if(!vis[i]){
59 int f=find(i);
60 dfs(f,0);
61 }
62 }
63 scanf("%d",&q);
64 while(q--){
65 int u,v;
66 scanf("%d%d",&u,&v);
67 if(find(u)!=find(v)) cout<<-1<<endl;
68 else cout<<val[lca(u,v)]<<endl;
69 }
70 return 0;
71 }
NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)的更多相关文章
- [NOIP2013] 提高组 洛谷P1967 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- Luogu P1967 货车运输(Kruskal重构树)
P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- 洛谷 P1967 货车运输(克鲁斯卡尔重构树)
题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...
- 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 洛谷P1967 货车运输
题目描述 \(A\)国有\(n\)座城市,编号从\(1\)到\(n\),城市之间有\(m\)条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有\(q\)辆货车在运输货物, 司机们想知道每辆车在 ...
随机推荐
- .net6与英雄联盟邂逅之——根据官方LCU API制作游戏助手
看了网上很多自己开发的英雄联盟的小助手工具,当时苦于没有api,自己也想做一个.后来发现了其实拳头本身就提供了LCU API在客户端运行的时候会暴露出来. 现在我们就来了解下工具的实现. 查询数据:h ...
- Postgres常用SQL
- 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...
- Excel 统计函数(四):AVERAGEIF 和 AVERAGEIFS
AVERAGEIF [语法]AVERAGEIF(range, criteria, [average_range]) [参数] range:要计算平均值的一个或多个单元格: criteria:筛选条件: ...
- 自动化选课(Python + selenium
前几天听到朋友说自己选课事情,突发奇想想要搞这样一个东西,但是由于各种原因只做到以下的完成度,具体的情况也会在解释的最后留下.这个只适用于曲师大的教务系统,因为用的这个系统来进行的一个调试,对于其 ...
- java数组---多维数组
多维数组 多维数组可以看成是数组的数组 比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 public static void main(String[] args) { ...
- java数组---数组的使用(打印,求和,最大值)
public static void main(String[] args) { int[] arrays={1,2,3,4,5}; //打印该数组 for (int i = 0; i < ar ...
- 究竟什么是Shadow DOM?
shadow dom 是什么? 顾名思义,shadow dom直译的话就是影子dom,但我更愿把它理解为DOM中的DOM.因为他能够为Web组件中的 DOM和 CSS提供了封装,实际上是在浏览器渲染文 ...
- APICloud 可视化编程 - 拖拉拽实现专业级源码
低代码开发平台是无需编码 (0 代码或⽆代码) 或通过少量代码就可以快速生成应用程序的开发平台.它的强⼤之处在于,允许终端⽤户使⽤易于理解的可视化⼯具开发自己的应用程序,而不是传统的编写代码⽅式.当遇 ...
- 第四十六篇:工程化概念以及什么是webpack
好家伙,这波是概念补充 1.什么是工程化概念? 我的开发: 开个项目,想怎么改怎么改,拉个东西过来就用 实际的前端开发: (1) 模块化(js的模块化,css的模块化,资源的模块化) (2) 组件化( ...