题目描述

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

Input

第一行有两个用一个空格隔开的整数\(n,m\),表示 $A \(国有\)n$ 座城市和 \(m\) 条道路。

接下来 \(m\)行每行3个整数\(x,y,z\),每两个整数之间用一个空格隔开,表示从 \(x\)号城市到\(y\)号城市有一条限重为 \(z 的道\)路。注意: **xx 不等于 yy,两座城市之间可能有多条道路 ** 。

接下来一行有一个整数 \(q\),表示有 \(q\) 辆货车需要运货。

接下来 \(q\) 行,每行两个整数 \(x\)、\(y\),之间用一个空格隔开,表示一辆货车需要从 \(x\) 城市运输货物到 \(y\) 城市,注意: **x 不等于 y ** 。

对于 \(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\)。

Output

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

Sample Input

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

Sample Output

3
-1
3

这个\(q\)的数据范围很显然是离线。。。

算法一:整体二分

仔细看题目,此题是要我们求出最大的\(x-y\)路径上的最小边权。

最大值最小,很显然可以二分答案。

把路径边权小于当前\(mid\)的边去掉,判断是否连通。

不过有那么多组数据一个个二分肯定很慢。

那么就可以用最巧妙的整体二分,把所有询问存下来,最后整体一起二分答案。

算法三:倍增

我们发现经过的路径一定是最大生成树上的边权。

因此,直接构造最大生成树,询问两个点时,实际上就是求\(a-lca(a,b)\)以及\(b-lca(a,b)\)路径上的最小值。

利用倍增维护即可。

算法二:启发式合并

此题是要我们求出最大的\(x-y\)路径上的最小边权。

我们先将所有询问的编号都丢到询问两边的点的\(set\)里面。

那我们就先把所有点都不建边,将所有边都存下来,再按边权由大到小排序,利用并查集维护连通。

将两个连通块连通时,我们同时将两个连通块的询问合并,这个过程可以利用启发式合并。

同时,若两个连通块的询问中有同一个编号,那么说明该询问这时被连通,更新答案即可。

代码如下

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define u64 unsigned long long
#define u32 unsigned int
#define reg register
#define Raed Read
#define debug(x) cerr<<#x<<" = "<<x<<endl;
#define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)
#define ret(a,b,c) for(reg int a=(b),a##_end_=(c); a<a##_end_; ++a)
#define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)
#define erep(i,G,x) for(reg int i=(G).Head[x]; i; i=(G).Nxt[i]) inline int Read() {
int res = 0, f = 1;
char c;
while (c = getchar(), c < 48 || c > 57)if (c == '-')f = 0;
do res = (res << 3) + (res << 1) + (c ^ 48);
while (c = getchar(), c >= 48 && c <= 57);
return f ? res : -res;
} template<class T>inline bool Min(T &a, T const&b) {
return a > b ? a = b, 1 : 0;
}
template<class T>inline bool Max(T &a, T const&b) {
return a < b ? a = b, 1 : 0;
} const int N = 1e5+5,M = 2e5 + 5,mod = 99999997; bool MOP1; int n,m; struct T360 {
map<int,int>E[N],vis[N];
struct node {
int x,y,z;
} Edge[500005];
struct cmp {
bool operator()(node a,node b)const {
return a.z>b.z;
}
};
int Ans[N];
set<int>S[N];
set<int>::iterator it;
int Fa[N];
int find(int x) {
return Fa[x]==x?Fa[x]:Fa[x]=find(Fa[x]);
}
inline void solve(void) {
int cnt=0;
rep(i,1,m) {
int x=Raed(),y=Read(),z=Read();
Max(E[x][y],z);
if(!vis[x][y])vis[x][y]=++cnt;
Edge[vis[x][y]]=(node)<%x,y,E[x][y]%>;
}
sort(Edge+1,Edge+cnt+1,cmp());
int q=Read();
rep(i,1,q) {
int x=Read(),y=Read();
S[x].insert(i),S[y].insert(i);
}
memset(Ans,-1,sizeof Ans);
rep(i,1,n)Fa[i]=i;
rep(i,1,cnt) {
int x=Edge[i].x,y=Edge[i].y,z=Edge[i].z;
x=find(x),y=find(y);
if(x==y)continue;
if(S[x].size()<S[y].size())swap(x,y);
for(it=S[y].begin(); it!=S[y].end(); it++) {
int Now=*it;
if(S[x].find(Now)==S[x].end())S[x].insert(Now);
else Ans[Now]=z;
}
Fa[y]=x;
}
rep(i,1,q)printf("%lld\n",Ans[i]);
}
} P60; bool MOP2; inline void _main(void) {
n=Read(),m=Read();
P60.solve();
} signed main() {
#define offline1
#ifdef offline
freopen("truck.in", "r", stdin);
freopen("truck.out", "w", stdout);
_main();
fclose(stdin);
fclose(stdout);
#else
_main();
#endif
return 0;
}

noip2013day1-货车运输的更多相关文章

  1. NOIP2013 D1T3 货车运输

    [NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...

  2. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  3. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  4. C++之路进阶——codevs3287(货车运输)

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

  5. NOIP2013 货车运输

    3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...

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

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

  7. 【NOIP2013提高组】货车运输

    货车运输  (truck.cpp/c/pas) [问题描述]  A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...

  8. Codevs3278[NOIP2013]货车运输

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

  9. 洛谷 P1967 货车运输

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

  10. P1967 货车运输

    P1967 货车运输最大生成树+lca+并查集 #include<iostream> #include<cstdio> #include<queue> #inclu ...

随机推荐

  1. 手动升级 Confluence 6 - 升级问题解决

    升级失败了? 如果你需要对你的升级进行回退,你必须首先恢复你老的 Confluence 备份.不要尝试再次进行升级,也不要尝试再次对升级失败的 Confluence 进行再次启动.  在升级过程中遇到 ...

  2. scrapy项目5:爬取ajax形式加载的数据,并用ImagePipeline保存图片

    1.目标分析: 我们想要获取的数据为如下图: 1).每本书的名称 2).每本书的价格 3).每本书的简介 2.网页分析: 网站url:http://e.dangdang.com/list-WY1-dd ...

  3. [VIJOS2053][SDOI2019]世界地图:最小生成树+虚树

    分析 可以发现第一列和最后一列永远不会被删除,于是我们可以想到维护前后缀最小生成树,但是直接维护的话显然时间空间两爆炸.(通过上网找题解)可以发现我们关心的只是最左边和最右边两列,而不关心内部的连边情 ...

  4. USACO2018DEC PLATINUM

    就按(博主认为的)难度顺序排吧. Sort It Out 分析 容易发现选出的集合一定是所有逆序对的一个最小覆盖集,那么剩下的就一定是一个LIS.仔细想想还可以发现字典序第\(k\)小的最小覆盖集的补 ...

  5. 文献引用 .bib文件里有公式符号

    问题: 有时候文献标题带有特殊公式符号,进行BibTex编译时,会识别不出来公式符号. 例如: .bib文件里的文献: @article{XIE201892, title = "ℋ∞ con ...

  6. Burp的XSS插件

    xss工具burpXSSVALIDIRTOR(XSS自动扫描) 第一步 安装环境 Phantomjs下载:http://phantomjs.org/download.html 下载后配置环境变量,把b ...

  7. python学习之路(3)

    字符串和编码 因为python最早只支持ASCII编码普通的字符串'ABC'在Python内部都是ASCII编码的.Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换 后来p ...

  8. Docker入门-介绍和安装

    Docker容器 Docker是什么 Docker最初是dotCloud公司创建人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于 ...

  9. python3笔记八:python数据类型-Number数字

    一:学习内容 数字类型分类:整数.浮点数.复数.布尔值 数字类型转换 数字类型的数学功能:abs().max().min().pow().round().math函数.random函数 二:数字类型分 ...

  10. 关于varchar的总结

    摘自:https://www.jianshu.com/p/c3e188440c67 大家都知道用 varchar 比用 char 类型更省空间(不过性能略有下降,char查询更快),相对于定长的 ch ...