Codevs3278[NOIP2013]货车运输
3287 货车运输
2013年NOIP全国联赛提高组
A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。
第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。
接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。
接下来一行有一个整数 q,表示有 q 辆货车需要运货。
接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。
输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出-1。
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q < 1,000;
对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q < 1,000;
对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q < 30,000,0 ≤ z ≤ 100,000。
分类标签 Tags 点此展开
题解:本来想把这道题当作个娱乐的,可是一写就逗比了,然后疯狂查错,查得要疯了——结果发现一开始快排写错了(HansBug:巨汗*_* phile:我也是醉疯了)
别的不难,思路就是——先最大生成树,然后每次只要访问在这棵树上面的路径的瓶颈值即可,我用了下lca算法,可是看样子时间相当之充裕让我都吓了一跳,所以估计就算是暴力找路的话估计也能差不多AC么么哒
type
point=^node;
node=record
g,w:longint;
next:point;
end;
var
i,j,k,l,m,n,tt,t,yy:longint;
a:array[..,..] of longint;
c,ct,f:array[..] of longint;
d,e:array[..,..] of longint;
b:array[..] of point;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
function getfat(x:longint):longint;
begin
if x<>c[x] then c[x]:=getfat(c[x]);
exit(c[x]);
end;
procedure merge(x,y:longint);
var a1,a2:longint;
begin
a1:=getfat(x);a2:=getfat(y);
if a1=a2 then exit;
c[getfat(x)]:=getfat(y);
dec(tt);
end;
function tog(x,y:longint):boolean;
begin
exit(getfat(x)=getfat(Y));
end;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;x:=a[(l+r) div ,];
repeat
while a[i,]>x do inc(i);
while a[j,]<x do dec(j);
if i<=j then
begin
swap(a[i,],a[j,]);
swap(a[i,],a[j,]);
swap(a[i,],a[j,]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if l<j then sort(l,j);
end;
procedure add(x,y,z:longint);
var p:point;
begin
new(p);
p^.w:=z;p^.g:=y;
p^.next:=b[x];b[x]:=p;
end;
procedure dfs(x:longint);
var p:point;
begin
p:=b[x];
while p<>nil do
begin
if d[,p^.g]= then
begin
d[,p^.g]:=x;
e[,p^.g]:=p^.w;
f[p^.g]:=f[x]+;
dfs(p^.g);
end;
p:=p^.next;
end;
end;
function fatfat(x,y:longint):longint;
var i,j:longint;
begin
i:=;
while y> do
begin
if odd(y) then x:=d[i,x];
inc(i);y:=y div ;
end;
exit(x);
end;
function fatlen(x,y:longint):longint;
var i,j:longint;
begin
i:=;j:=maxlongint;
while y> do
begin
if odd(y) then
begin
j:=min(j,e[i,x]);
x:=d[i,x];
end;
inc(i);y:=y div ;
end;
exit(j);
end;
function getlent(x,y:longint):longint;
var a1,a2,a3,a4,i:longint;
begin
if c[x]<>c[y] then exit(-);
if f[x]<f[y] then swap(x,y);
a3:=x;a4:=y;
x:=fatfat(x,f[x]-f[y]);
if x=y then exit(fatlen(a3,f[a3]-f[a4]));
for i:= downto do
begin
if not((d[i,x]=) or (d[i,x]=d[i,y])) then
begin
x:=d[i,x];
y:=d[i,y];
end;
end;
a1:=d[,x];
exit(min(fatlen(a4,f[a4]-f[a1]),fatlen(a3,f[a3]-f[a1])));
end;
begin
readln(n,m);
for i:= to m do readln(a[i,],a[i,],a[i,]);
sort(,m);
FOR I:= to n do c[i]:=i;
tt:=n;
for i:= to m do
merge(a[i,],a[i,]);
for i:= to n do c[i]:=i;
for i:= to n do b[i]:=nil;
j:=;
fillchar(d,sizeof(d),);yy:=tt;
for i:= to n-yy do
begin
inc(j);
while tog(a[j,],a[j,]) do inc(j);
add(a[j,],a[j,],a[j,]);
add(a[j,],a[j,],a[j,]);
merge(a[j,],a[j,]);
end;
for i:= to n do c[i]:=getfat(c[i]);
fillchar(ct,sizeof(ct),);
fillchar(f,sizeof(f),);
for i:= to n do
begin
if ct[c[i]]= then
begin
ct[c[i]]:=;
d[,i]:=-;
dfs(i);
d[,i]:=;
end;
end;
for i:= to do
for j:= to n do
begin
d[i,j]:=d[i-,d[i-,j]];
if (e[i-,d[i-,j]]<>) and (e[i-,j]<>) then
e[i,j]:=min(e[i-,d[i-,j]],e[i-,j])
else
begin
if e[i-,d[i-,j]]= then
begin
if e[i-,j]= then
e[i,j]:=maxlongint
else
e[i,j]:=e[i-,j] end
else
e[i,j]:=e[i-,d[i-,j]];
end;
end;
readln(t);
for i:= to t do
begin
readln(j,k);
writeln(getlent(j,k));
end;
readln;
end.
Codevs3278[NOIP2013]货车运输的更多相关文章
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...
- noip2013货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- NOIP2013货车运输[lca&&kruskal]
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- [noip2013]货车运输(kruskal + 树上倍增)
描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
- [luogu P1967][NOIp2013] 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- cvc-complex-type.2.4.c: The matching wildcard...
在家里的电脑好好的,在单位的就不行,需要把web app libraties提到 最前面,然后clean一下项目
- WInform 创建一个简单的WPF应用
(一)创建一个简单的WPF应用 首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版.因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们 ...
- HttpServletRequest和ServletRequest的区别
servlet理论上可以处理多种形式的请求响应形式,http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和Servle ...
- 工厂模式在JS中的实践
.mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...
- 百度人脸识别api及face++人脸识别api测试(python)
一.百度人脸识别服务 1.官方网址:http://apistore.baidu.com/apiworks/servicedetail/464.html 2.提供的接口包括: 2.1 多人脸比对:请求多 ...
- java算法 蓝桥杯 格子位置
问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...
- 编写JQuery插件-1
看到这篇文章的人相信大家都学会了jq,或者正在用jq,在这里简单介绍一下jq的插件封装: jQuery的插件主要分为3种类型: 1.封装对象方法的插件 这种插件是将对象的方法封装起来,用于对通过选择器 ...
- JavaScript从作用域到闭包
目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包 作用域(scope) 全局作用域 ...
- CSS3知识点整理(二)----CSS3选择器
总结各种CSS3选择器的介绍及具体语法 (一)属性选择器 在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进行了扩展,新增了3个属性选择器,使得属性选择器有了通配符的概念,这 ...
- iOS UISearchController 的使用方法
iOS UISearchController 的使用方法 UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作.UISearchCon ...