http://codevs.cn/problem/3287/

题目描述

国有 座城市,编号从 ,城市之间有 条双向道路。每一条道路对车辆都有重
量限制,简称限重。现在有 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的
情况下,最多能运多重的货物。

输入格式

输入文件第一行有两个用一个空格隔开的整数 , 表示 国有 座城市和 条道
路。
接下来 行每行 个整数 ,每两个整数之间用一个空格隔开,表示从 号城市
号城市有一条限重为 的道路。注意: 不等于 ,两座城市之间可能有多条道路。
接下来一行有一个整数 ,表示有 辆货车需要运货。
接下来 行,每行两个整数 ,之间用一个空格隔开,表示一辆货车需要从 城市
运输货物到 城市,注意: 不等于

输出格式

输出共有 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货
车不能到达目的地,输出

输入样例

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

输出样例

3
-1
3

数据范围

题解

可以证明最优路径一定在最大生成树(森林)上,于是题目便转化为,询问森林中两点路径上边权最小值,连通性用并查集判断即可。

对于一棵树上的一次询问,可以用倍增的方法解决。

表示点 向上 步到达的结点                           

 表示点 向上  步的路径中的边权最小值

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#define N 10005
#define M 50005
#define depth 21
using namespace std; int n,m,q,cnt,tot,ans;
int f[N],last[N],dep[N];
int anc[N][],g[N][];
struct hh
{int to,next,w;}e[M<<];
struct hhh
{int l,r,w;}line[M<<];
bool cmp(hhh a,hhh b){return a.w>b.w;}
int read()
{
int ret=;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c)){ret=(ret<<)+(ret<<)+c-'';c=getchar();}
return ret;
}
void add(int a,int b,int w)
{
e[++tot].to=b;
e[tot].next=last[a];
e[tot].w=w;
last[a]=tot;
}
void bfs(int root)
{
int i,j,now;
stack<int> s;
s.push(root);dep[root]=;
for(i=;i<depth;i++) anc[root][i]=root;
while(!s.empty())
{
now=s.top();s.pop();
if(now!=root)
for(i=;i<depth;i++)
{
anc[now][i]=anc[anc[now][i-]][i-];
g[now][i]=min(g[now][i-],g[anc[now][i-]][i-]);
}
for(i=last[now];i;i=e[i].next)
if(!dep[e[i].to])
{
anc[e[i].to][]=now;
dep[e[i].to]=dep[now]+;
g[e[i].to][]=e[i].w;
s.push(e[i].to);
}
}
}
void swim(int& x,int h)
{
int i;
for(i=;h;i++)
{
if(h&) x=anc[x][i];
h>>=;
}
}
int getlca(int x,int y)
{
int i,j;
if(dep[x]<dep[y]) swap(x,y);
swim(x,dep[x]-dep[y]);
if(x==y) return x;
while(true)
{
for(i=;anc[x][i]!=anc[y][i];i++);
if(!i) return anc[x][];
x=anc[x][i-];y=anc[y][i-];
}
}
int query(int x,int y)
{
int i,ret=,h;
h=dep[y]-dep[x];
for(i=depth;i>=;i--)
if((<<i)<=h)
{
h-=(<<i);
ret=min(ret,g[y][i]);
y=anc[y][i];
}
return ret;
}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
int i,j,u,v,w,fx,fy,lca;
n=read();m=read();
for(i=;i<=m;i++)
line[i].l=read(),line[i].r=read(),line[i].w=read();
sort(line+,line++m,cmp);
for(i=;i<=n;i++) f[i]=i;
for(i=;i<=m;i++)
{
u=line[i].l;v=line[i].r;w=line[i].w;
fx=find(u);fy=find(v);
if(fx!=fy)
{
f[fx]=fy;cnt++;
add(u,v,w);add(v,u,w);
if(cnt==n-) break;
}
}
for(i=;i<=n;i++)
for(j=;j<depth;j++)
g[i][j]=;
bfs();
q=read();
for(i=;i<=q;i++)
{
u=read();v=read();
if(find(u)!=find(v)){puts("-1");continue;}
lca=getlca(u,v);
ans=min(query(lca,u),query(lca,v));
printf("%d\n",ans);
}
return ;
}

【CODEVS 3287】【NOIP2013】火车运输的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

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

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

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

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

  5. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

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

  6. Codevs 3287 货车运输 == 洛谷P1967

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

  7. Codevs 3287 货车运输

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

  8. 货车运输(codevs 3287)

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

  9. NOIP2013 DAY2 T3火车运输

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

随机推荐

  1. Entity Framework 在Vs2012下Update Model From DataBase 失败的问题

    http://stackoverflow.com/questions/13054212/vs-2012-ef-5-0-update-model-from-database-not-picking-up ...

  2. C# Like参数化 小记

    strBuilder.Append(" and b.name like '%' + @name + '%'"); parameters.Add(new SqlParameter(& ...

  3. alt属性和title属性差异---终于分清楚了!

    凡是接触过前端的开发者,相信都会接触到<img>标签,自然alt title更是不会陌生,但对他们真正的含义和使用方法,你确定了解吗? 参考: http://www.junchenwu.c ...

  4. CSS技巧(二):CSS hack

    什么是CSS hack CSS hack由于不同的浏览器,比如IE6,IE7,Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果. 这个时候我们就需 ...

  5. [LeetCode] Additive Number

    Af first I read the title as "Addictive Number". Anyway, this problem can be solved elegan ...

  6. 发布FTP服务,防火墙配置

    最近需要在Web服务器上发布一下FTP,不想安装Server-U之类的,就用IIS的了,安装好后,发现外网无法连接.经过测试,发现是防火墙的问题. 查找了下关于FTP的资料,ftp server支持两 ...

  7. unity3d 本地数据存储

    using UnityEngine; using System.Collections; //路径工具类 public class PathKit { /** 后缀常量字符 */ public con ...

  8. asp.net mvc 利用过滤器进行网站Meta设置

    过去几年都是用asp.net webform进行开发东西,最近听说过时了,同时webform会产生ViewState(虽然我已经不用ruanat=server的控件好久了 :)),对企业应用无所谓,但 ...

  9. C#获取内网和外网IP

    写了个小客户端,里面用到了获取内网和外网的IP地址,代码如下: // InnerIP var ipHost = Dns.Resolve(Dns.GetHostName()); ]; innerIP = ...

  10. Python Django 开发 2 数据库

    一半教程用的Django都是1.8以前的版本,导致跟我用的1.8.2的版本用法有些出入,所以只能自己去官网看文档,以下一下是看官方文档而理解的,英语渣渣,可能会有理解有误的地方 先记录下如何查看dja ...