【问题描述】

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)题解相关推荐

  1. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  2. codevs 3287 货车运输

    codevs 3287 货车运输 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运 ...

  3. codevs 3287 货车运输 NOIP2013提高组

    题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 1 #include& ...

  4. [Codevs] 3287 货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城 ...

  5. [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)

    一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...

  6. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  7. 倍增LCA NOIP2013 货车运输

    货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  8. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

  9. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  10. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...

最新文章

  1. 远程接入构建企业信息的计划时代--极通EWEBS
  2. 高速缓存系统之memcache c++使用实例
  3. android activity生命周期的一张经典图片
  4. 机器人学习--定位、建图、SLAM(声呐、激光等扫描束方案)的发展史
  5. gets函数会读取回车吗_会做二次函数吗?用6种方法教你做二次函数(初中生不要错过)...
  6. NYOJ 10 skiing
  7. 使用while和FOR循环分布打印字符串S='asdfer' 中的每一个元素
  8. 小屏党失望!iPhone 13四款机型,mini版没了
  9. ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
  10. 在线JSON转io-ts工具
  11. C++字符串拼接效率比较(+=、append、stringstream、spintf)
  12. M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network AAAI2019
  13. 用word写接口文档时的常规格式设置
  14. 企业微信接入第三方应用(以服务商身份)
  15. 基于波动率模型对上证综指的建模与实证分析
  16. 苏宁易购首页仿写代码-仅供参考# 话不多说,直接上代码,苏宁易购手机app网站首页,仅供参考
  17. STM32可用的QRCODE二维码生成库
  18. 写给四十岁女人的箴言,写给四十岁男人的忠告
  19. chatgpt的150个指令大全
  20. 某精英枪战游戏辅助脚本加密破解

热门文章

  1. upupw切换php,UPUPW安装PHP扩展组件的相关说明
  2. swift学习-闭包
  3. 迅捷PDF转PPT转换器使用教程
  4. unity 性能优化之遮挡剔除(Occlusion Culling)
  5. python操作excel--生成图表
  6. 用CSS控制浏览器滚动条样式源代码
  7. 腾讯电脑管家10.0 官方最新版
  8. 《我的世界》Python编程入门(1)Minecraft(我的世界)Python编程环境搭建
  9. 精诚EAS-EAM条码化资产管理软件
  10. 《Adobe InDesign CS5中文版经典教程》—第1课复习