试题描述
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。

这里用了某神犇论文中的解法。

首先做一遍最大生成树,那么问题转化成了树上路径查询最小值,我们考虑用按秩合并的并查集来做。

做最大生成树当合并节点(x,y)时,考虑将x的fa设为y,并记录v[x]=e[i].w。

那么询问时我们先判断两点是否在同一连通分量中,然后因为按秩合并的树高最多是logn的,暴力向上找并更新答案即可。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
const int maxn=50010;
struct Edge {int u,v,w;bool operator < (const Edge& ths) const {return w>ths.w;}
}e[maxn];
int n,m,q,pa[maxn],rk[maxn],v[maxn];
int findset(int x) {return x==pa[x]?x:findset(pa[x]);}
int get(int x,int& d) {if(x==pa[x]) return x;d++;return get(pa[x],d);
}
int main() {n=read();m=read();rep(1,n) pa[i]=i;rep(1,m) e[i].u=read(),e[i].v=read(),e[i].w=read();sort(e+1,e+m+1);rep(1,m) {int x=findset(e[i].u),y=findset(e[i].v);if(x!=y) {if(rk[x]>rk[y]) swap(x,y);pa[x]=y;v[x]=e[i].w;if(rk[x]==rk[y]) rk[y]++;}}q=read();while(q--) {int d1=0,d2=0,ans=1e9;int x=read(),y=read();if(get(x,d1)==get(y,d2)) {if(d1<d2) swap(x,y),swap(d1,d2);rep(1,d1-d2) ans=min(ans,v[x]),x=pa[x];while(x!=y) {ans=min(ans,min(v[x],v[y]));x=pa[x];y=pa[y];}printf("%d\n",ans);}else puts("-1");}return 0;
}

View Code

转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/4624231.html

NOIP201307货车运输相关推荐

  1. 倍增LCA NOIP2013 货车运输

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

  2. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

  3. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  4. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...

  5. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  6. NOIP2013货车运输

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

  7. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  8. noip 2013 洛谷 P1967 货车运输

    题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...

  9. LUOGU 1967 货车运输 [noip 2013]

    * 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...

最新文章

  1. 数组 字符串的解构赋值 以及const命令
  2. Mysql 存储引擎和事物基础概念
  3. Python3 注释
  4. php 调用memcache,Windows下的Memcache安装(php调用)
  5. elasticsearch id查询_互联网公司中对【Elasticsearch】的真实应用案例
  6. 固定资产管理有关的计算机知识,计算机技术在固定资产管理中的具体应用.pdf...
  7. 收藏 | 深度学习检测小目标常用方法
  8. linux命令-tar命令
  9. 身份证号有效性检验代码 (python)
  10. [企业内部https证书配置]tomcat 7配置https的完整历程
  11. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发鼻涕下拉粘连效果
  12. list的一些常见用法总结(实用干货收藏)
  13. Contest2257 - 抗击疫情,从我做起--大中小学生联合训练赛第五十二场
  14. 华为vlan间路由:利用路由器实现不同vlan间的通信
  15. Matlab求单边谱,关于实信号的双边谱和单边谱
  16. JAVA工具类(17)--Java导入导出Excel工具类ExcelUtil
  17. 考研语法整理(简洁版)
  18. CMS模板标签设计使用说明
  19. 计算机语言中的逻辑异或的应用,异或同或门逻辑符号_利用或门和非门设计的异或门方案...
  20. 怎么查找html元素

热门文章

  1. 关于活动对像要注意的问题
  2. Mysql 开启远程连接
  3. 获取/设置IFRAME内对象元素的几种JS方法
  4. 结对编程作业——毕设导师智能匹配
  5. java 正则提取及替换字符串
  6. delphi基本语法
  7. Java高级篇 -- List选择及优化
  8. Javascript s08
  9. Oracle找出需要建立索引的表
  10. [跟我学UML] UML中的对象图