NOIP201307货车运输
2016.1.28
试题描述
|
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 |
其他说明
|
数据范围:0<n<10,000,0<m<50,000,0<q<30,000,0≤z≤100,000。
|
先是最大生成树构图,注意构成的图可能不止一棵树,可能是好几棵树之间不联通。
然后对于询问,两个节点不联通(并查集判定)则无lca。
联通的话就LCA吧,因为路径肯定过lca,找lca的同时就把路径上的边权最小值更新了。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxlog=;
inline int read();
struct data
{
int a,b,c;
bool operator<(data d)const
{
return c>=d.c;
}
}Edge[];
int n,m,q,father[],f[][],dist[][],dep[];
int last[],final[],to[],w[],e,vis[];
int FindFather(int x)
{
if(x==father[x]) return x;
return father[x]=FindFather(father[x]);
}
void AddEdge(int a,int b,int c)
{
to[++e]=b;w[e]=c;last[e]=final[a];final[a]=e;
to[++e]=a;w[e]=c;last[e]=final[b];final[b]=e;
}
void LCA(int x)
{
vis[x]=;
for(int i=;(<<i)<=dep[x];i++)
{
int c=f[x][i-];
f[x][i]=f[c][i-];
dist[x][i]=min(dist[x][i-],dist[c][i-]);
}
for(int i=final[x];i;i=last[i])
{
if(!vis[to[i]])
{
dep[to[i]]=dep[x]+;
f[to[i]][]=x;
dist[to[i]][]=w[i];
LCA(to[i]);
}
}
}
int query(int a,int b)
{
int ret=;
if(dep[a]<dep[b]) swap(a,b);
for(int i = maxlog ; i >= ; i-- ) if(dep[a]-(<<i)>=dep[b])
{
ret=min(ret,dist[a][i]);a=f[a][i];
}
if(a==b) return ret;
for(int i = maxlog ; i >= ; i-- ) if(dep[a] > (<<i) && f[a][i] != f[b][i])
{
ret = min(ret, min(dist[a][i], dist[b][i]) );
a=f[a][i];b=f[b][i];
}
return min(ret, min(dist[a][], dist[b][]) );
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
Edge[i].a=read();Edge[i].b=read();Edge[i].c=read();
}
sort(Edge+,Edge+m+);
for(int i=;i<=n;i++) father[i]=i;
for(int i=;i<=m;i++)
{
int u=FindFather(Edge[i].a),v=FindFather(Edge[i].b);
if(u!=v)
{
father[u]=v;
AddEdge(Edge[i].a,Edge[i].b,Edge[i].c);
}
}
for(int i=;i<=n;i++) if(!vis[i]) LCA(i);
q=read();
while(q--)
{
int x=read(),y=read();
if(FindFather(x) != FindFather(y)) printf("-1\n");
else printf("%d\n",query(x,y));
}
}
//----------------------------------------------------
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>'') {
if(ch=='-') f=-;ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
NOIP201307货车运输的更多相关文章
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 【NOIP2013提高组】货车运输
货车运输 (truck.cpp/c/pas) [问题描述] A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- P1967 货车运输
P1967 货车运输最大生成树+lca+并查集 #include<iostream> #include<cstdio> #include<queue> #inclu ...
随机推荐
- 105 董婷婷 第二次Sprint总结
总结: 第二次冲刺结束了,这次冲刺的主要任务是建立数据库.项目进行到现在也基本定型了,满满的成就感啊.经过一段时间的合作,团队成员间的默契大大提高,还有最后一次冲刺,队友们,加油哦!
- Joomla及其类似软件的说明分析
Joomla不单单是一款免费的软件,还是在国外相当知名的及内容管理.web开发及手机应用开发等为一体的一套系统.Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux. W ...
- 关于redis扩展安装及使用
11月23日,预留 http://blog.sina.com.cn/s/blog_68431a3b0102v6dz.html http://blog.csdn.net/rachel_luo/artic ...
- leetcode 179. Largest Number 求最大组合数 ---------- java
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- Linux运维人员如何学习python编程
Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...
- js 测试
今天js测试题目: 被基础题目虐暴......惨不忍睹 1. var num = 2; switch(num){ case 1: console.log("1"); case 2: ...
- 如何在Jenkins CI 里调试
背景 厂内的CI系统把 Jenkins 和Github 连接了起来,这样Dev 只要通过github pr 就能够了解到测试job 运行的情况.有的时候,Dev会找到QA问,如何在Jenkins CI ...
- golang 文件操作
package main import ( "bytes" "fmt" "io" "os" ...
- 【转】MAPI over HTTP协议
这是一篇非常详细和精彩的介绍MAPI over HTTP协议英文博文.原文地址如下: http://blogs.technet.com/b/exchange/archive/2014/05/09/ou ...
- SQL NULL 值【摘自W3C】
SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...