货车运输(codevs 3287)题解
【问题描述】
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
【样例输入】
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
【样例输出】
3
-1
3
【解题思路】
本题为NOIP2013提高组day1第三题,首先我们可以看出这是一道求最大生成树的问题,用kruscal求出,对于我们要找的两个点,先判断是否有边相连,没有直接输出-1,然后将选中的边建成一棵带权树,接着我们求LCA来求两点之间的最小载重量,这里可以去看看LCA,我用的是倍增的方法,然后边求LCA边算两点到该点的最小值,最后输出即可。
【代码实现】
1 uses math;2 const mi:array[0..14]of longint=(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384);3 var n,m,q,tot,i,j,x,y:longint;4 a,b,v:array[0..50000]of longint;5 fa,h:array[0..10000]of longint;6 flag:array[0..10000]of boolean;7 first,last,next,w:array[0..100000]of longint;8 f,g:array[0..10000,0..14]of longint;9 function gf(x:longint):longint;10 begin11 if fa[x]=x then12 exit(x);13 fa[x]:=gf(fa[x]);14 exit(fa[x]);15 end;16 procedure swap(var x,y:longint);17 var t:longint;18 begin19 t:=x;20 x:=y;21 y:=t;22 end;23 procedure sort(l,r: longint);24 var25 i,j,x,y: longint;26 begin27 i:=l;28 j:=r;29 x:=v[(l+r) div 2];30 repeat31 while v[i]>x do32 inc(i);33 while x>v[j] do34 dec(j);35 if not(i>j) then36 begin37 swap(a[i],a[j]);38 swap(b[i],b[j]);39 swap(v[i],v[j]);40 inc(i);41 j:=j-1;42 end;43 until i>j;44 if l<j then45 sort(l,j);46 if i<r then47 sort(i,r);48 end;49 procedure insert(x,y,v:longint);50 begin51 inc(tot);52 w[tot]:=v;53 last[tot]:=y;54 next[tot]:=first[x];55 first[x]:=tot;56 end;57 procedure dfs(x,dep:longint);58 var i:longint;59 begin60 flag[x]:=true;61 h[x]:=dep;62 i:=first[x];63 while i<>0 do64 begin65 if not flag[last[i]] then66 begin67 f[last[i],0]:=x;68 g[last[i],0]:=w[i];69 dfs(last[i],dep+1);70 end;71 i:=next[i];72 end;73 end;74 function ans(x,y:longint):longint;75 var k:longint;76 begin77 ans:=maxlongint;78 if h[x]<h[y] then79 swap(x,y);80 while h[x]>h[y] do81 begin82 k:=0;83 while h[x]-h[y]>=mi[k+1] do84 inc(k);85 ans:=min(ans,g[x,k]);86 x:=f[x,k];87 end;88 while x<>y do89 begin90 if f[x,0]=f[y,0] then91 begin92 ans:=min(ans,min(g[x,0],g[y,0]));93 break;94 end;95 k:=0;96 while (f[x,k+1]<>f[y,k+1])and(h[x]>=mi[k+1]) do97 inc(k);98 ans:=min(ans,min(g[x,k],g[y,k]));99 x:=f[x,k]; 100 y:=f[y,k]; 101 end; 102 end; 103 begin 104 readln(n,m); 105 for i:=1 to m do 106 readln(a[i],b[i],v[i]); 107 sort(1,m); 108 for i:=1 to n do 109 fa[i]:=i; 110 for i:=1 to m do 111 if gf(a[i])<>gf(b[i]) then 112 begin 113 fa[fa[a[i]]]:=fa[b[i]]; 114 insert(a[i],b[i],v[i]); 115 insert(b[i],a[i],v[i]); 116 end; 117 for i:=1 to n do 118 if not flag[i] then 119 dfs(1,0); 120 i:=1; 121 while mi[i]<n do 122 begin 123 for j:=1 to n do 124 if h[j]>=mi[i] then 125 begin 126 f[j,i]:=f[f[j,i-1],i-1]; 127 g[j,i]:=min(g[j,i-1],g[f[j,i-1],i-1]); 128 end; 129 inc(i); 130 end; 131 readln(q); 132 for i:=1 to q do 133 begin 134 readln(x,y); 135 if gf(x)=gf(y) then 136 writeln(ans(x,y)) 137 else 138 writeln(-1); 139 end; 140 end.
转载于:https://www.cnblogs.com/PengBoLiuXu/p/4550037.html
货车运输(codevs 3287)题解相关推荐
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- codevs 3287 货车运输
codevs 3287 货车运输 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运 ...
- codevs 3287 货车运输 NOIP2013提高组
题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 1 #include& ...
- [Codevs] 3287 货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- 货车运输题解 最大生成树+lca
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...
- 倍增LCA NOIP2013 货车运输
货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...
- poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca
学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...
最新文章
- 远程接入构建企业信息的计划时代--极通EWEBS
- 高速缓存系统之memcache c++使用实例
- android activity生命周期的一张经典图片
- 机器人学习--定位、建图、SLAM(声呐、激光等扫描束方案)的发展史
- gets函数会读取回车吗_会做二次函数吗?用6种方法教你做二次函数(初中生不要错过)...
- NYOJ 10 skiing
- 使用while和FOR循环分布打印字符串S='asdfer' 中的每一个元素
- 小屏党失望!iPhone 13四款机型,mini版没了
- ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
- 在线JSON转io-ts工具
- C++字符串拼接效率比较(+=、append、stringstream、spintf)
- M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network AAAI2019
- 用word写接口文档时的常规格式设置
- 企业微信接入第三方应用(以服务商身份)
- 基于波动率模型对上证综指的建模与实证分析
- 苏宁易购首页仿写代码-仅供参考# 话不多说,直接上代码,苏宁易购手机app网站首页,仅供参考
- STM32可用的QRCODE二维码生成库
- 写给四十岁女人的箴言,写给四十岁男人的忠告
- chatgpt的150个指令大全
- 某精英枪战游戏辅助脚本加密破解