[NOIP2013提高组]货车运输
题目:洛谷P1967、Vijos P1843、codevs3287。
题目大意:有n个城市m条道路,每条道路有一个限重,规定货车运货不能超过限重。有一些询问,问你两个城市之间一次最多能运多少重的货(可能无法到达)。
解题思路:首先,要保证原来连通的点连通,限重要尽可能大,所以最大生成树。然后对每个询问找两个点的最近公共祖先,然后求出两点路径上最大限重的最小值即可。
用倍增求LCA,可以边算边求出最小值,不用用一些复杂的方法。代码中我用sml[x][i]表示x和它的第$2^i$个祖先之间的路径上最大限重的最小值。然后在倍增时更新答案即可。详见代码
C++ Code:
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cstdio>
using std::sort;
using std::swap;
struct edge{
int u,v,t;
bool operator < (const edge& rhs)const{return t>rhs.t;}
}e[50005];
struct tree_edge{
int to,dist,nxt;
}E[120005];
int n,m,fa[10005],head[10005]={0},cnt=0,ans,deep[10005],p[10005][16],sml[10005][16];
inline int min(int a,int b){return(a<b)?(a):(b);}
inline int readint(){
char c=getchar();
int p=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())p=(p<<3)+(p<<1)+(c^'0');
return p;
}
int dad(int x){return(fa[x]==x)?(x):(fa[x]=dad(fa[x]));}
inline int addedge(int from,int to,int dist){
E[++cnt]=(tree_edge){to,dist,head[from]};
head[from]=cnt;
E[++cnt]=(tree_edge){from,dist,head[to]};
head[to]=cnt;
}
void dfs(int u){
for(int i=head[u];i;i=E[i].nxt)
if(!deep[E[i].to]){
deep[E[i].to]=deep[u]+1;
p[E[i].to][0]=u;
sml[E[i].to][0]=E[i].dist;
dfs(E[i].to);
}
}
void init(){
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1],sml[i][j]=min(sml[i][j-1],sml[p[i][j-1]][j-1]);
}
int lca(int x,int y,int& ans){
ans=2000000000;
int i;
if(deep[x]<deep[y])swap(x,y);
for(i=0;(1<<i)<=n;++i);--i;
for(int j=i;j>=0;--j)
if(deep[p[x][j]]>=deep[y]){
ans=min(ans,sml[x][j]),x=p[x][j];
}
if(x==y)return x;
for(int j=i;j>=0;--j)
if(p[x][j]!=p[y][j]&&p[x][j]!=-1){
ans=min(ans,min(sml[x][j],sml[y][j]));
x=p[x][j];
y=p[y][j];
}
ans=min(ans,min(sml[x][0],sml[y][0]));
return p[x][0];
}
int main(){
n=readint(),m=readint();
for(int i=1;i<=m;++i)e[i].u=readint(),e[i].v=readint(),e[i].t=readint();
sort(e+1,e+m+1);
for(int i=1;i<=n;++i)fa[i]=i;
for(int okE=1,now=1;now<=m;++now){
int a=dad(e[now].u),b=dad(e[now].v);
if(a!=b){
fa[b]=a;
addedge(e[now].u,e[now].v,e[now].t);
++okE;
}
if(okE==n)break;
}
int Q=readint();
memset(deep,0,sizeof deep);
memset(p,-1,sizeof p);
memset(sml,0x3f,sizeof sml);
for(int i=1;i<=n;++i)
if(!deep[i]){
deep[i]=1;
dfs(i);
}
init();
while(Q--){
int x=readint(),y=readint();
int a=dad(x),b=dad(y);
if(a!=b){
puts("-1");
continue;
}
lca(x,y,ans);
printf("%d\n",ans);
}
}
[NOIP2013提高组]货车运输的更多相关文章
- [NOIP2013 提高组] 货车运输
前言 使用算法:堆优化 \(prim\) , \(LCA\) . 题意 共有 \(n\) 个点,有 \(m\) 条边来连接这些点,每条边有权值.有 \(q\) 条类似于 \(u\) \(v\) 询问, ...
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
- 【NOIP2013提高组】货车运输
货车运输 (truck.cpp/c/pas) [问题描述] A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...
- NOIP2013 提高组 Day1
https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...
- 【NOIP2013提高组T3】加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- noip2013 提高组
T1 转圈游戏 题目传送门 果不其然 第一题还是模拟题 一波快速幂解决问题 #include<cstdio> #include<cstring> #include<alg ...
随机推荐
- ShellExcuteA
ShellExecuteA(,//0表示系统打开 "open",//操作 "1.mp3",//操作路径 0,//第四个,第五个参数都是保留参数,默认都为0 0, ...
- BOOL的getter方法
在代码中经常会看到这样的属性声明 @property (nonatomic,assign,getter = isRead)BOOL read; 这行代码的意思就是,声明一个BOOL类型的read,但是 ...
- POJ 1275 差分约束
一堆化不等式,,,,,, 懒得写了... 请看mars_ch的blog-.. 戳戳戳戳戳 还是她给我找的错---. //By SiriusRen #include <queue> #inc ...
- jquery/zepto在插件编写上的几点区别
1. 自定义事件的命名空间 jq的时间命名空间是用点“.”,而zepto是用冒号“:” 如 //jquery $(this).trigger('cusevent.pluginname'); //zep ...
- 简易Servlet计算器1.0
编写一个简易的Servlet计算器,暂时仅能实现 + - * / % 五种运算 jsp界面: <%@ page language="java" contentType=&qu ...
- rem 、em
介绍:rem是相对字体单位:根据html根元素大小而定,同样可作为宽高等单位: 适配原理:将px替换成rem,采用rem适配移动web的原理,根据不同屏幕宽度设置html的font-size的大小: ...
- [转]m3u8直播测试地址
http://www.cnblogs.com/yuandaozhe/p/5755453.html 调试m3u8的时候需要测试地址 找了几个,备用一下 安徽卫视 http://stream2.ahtv. ...
- Codeforces 959E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))
题目: 解题思路 这题就是0,1,2...n-1总共n个数字形成的最小生成树. 我们可以发现,一个数字k与比它小的数字形成的异或值,一定可以取到k与所有正整数形成的异或值的最小值. 要计算n个数字的情 ...
- python中的json
import json# dumps #一般处理字符串# dump #一般处理文件 #字符串和json之间的转换test_dict={"name":"fxh", ...
- idea运行提示Error:java:无效的源发行版:1.9
如果你是jdk1.8 改到8即可,如图: