【问题描述】

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. 免安装的mysql删除_MySQL5.7 免安装版配置及删除图文教程
  2. 第二单元linux系统
  3. 大学计算机基础python第二次作业_第二次python作业-titanic数据练习
  4. HTML dfn元素
  5. JAVA设计模式初探之适配器模式(转)
  6. linux分析目录内存,在 Linux x86-64 模式下分析内存映射流程
  7. ajax异步获取右侧html,Ajax异步获取html数据中包含js方法无效的解决方法
  8. Windows系统端口占用,使用命令行查找并杀进程
  9. wordpress配置google search console失败_Wordpress在国内无法打开后台撰写新文章的解决办法...
  10. kettle 无法连接数据库
  11. PhotoShop简单案例(1)——利用时间轴功能制作简单动画
  12. verilog实现状态机
  13. 攻防世界逆向-logmein
  14. 分数排名 leecode 学习笔记
  15. 智能网联汽车云控系统第3部分:路云数据交互规范
  16. goldendict无法导入字典
  17. 修11代12代希捷坏道
  18. [unreal4入门系列之一] Unreal4引擎是什么
  19. 电脑显示请检查映像服务器,该任务映像已损坏或已篡改的解决方法
  20. 编程进阶一:编译器的特殊功能使用及借助编译时完成数据的初始化

热门文章

  1. C# ------ MEF
  2. 求CNOUG注册用的邀请码!
  3. cdr 表格自动填充文字_活久见!Excel里输入文字,还能这样做?!
  4. 2019年互联网行业从业前景如何?
  5. SAP 如何修改SAPSR3密码
  6. 小程序商店刷榜_微信小程序怎么通过“硬广”“软广”来运营引流?运营干货...
  7. 惠普HP Photosmart 2605 打印机驱动
  8. 【报告分享】新国货彩妆洞察白皮书-蓝色光标(附下载)
  9. 开源项目JCG,运行时json转class并支持添加注解
  10. 计算机系统结构自考大纲,2013自考《计算机系统结构》课程大纲说明