qwb与学姐 (带秩并查集)
qwb与学姐
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 149 Solved: 54
[Submit][Status][Web Board]
Description
已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,
现在有 k个询问,
询问从A点到B点的所有路径的值的最大值。
qwb听完这个问题很绝望啊,聪明的你能帮帮他吗?
Input
第一行三个整数n,m,k (1<=N<=50000,m<=200000,k<=100000)。
第2..m+1行:三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N,1<=D<=215) 表示X与Y之间有一条长度为D的边。
第m+2..m+k+1行: 每行两个整数A B(1<=A,B<=n且A≠B),意义如题目描述。
保证图连通。
Output
Sample Input
4 5 3
1 2 6
1 3 8
2 3 4
2 4 5
3 4 7
2 3
1 4
3 4
Sample Output
6
7
7
【分析】给你一个连通无向图,然后K次询问,每次给出两个点U,V,一条路径中最小的边称为路径的值,问你从U到V的所有路径中,
路径的值最大是多少。
要是只有一次询问的话,还能二分搞搞...这1e5次询问太TM恶心了。我们二分的时候是二分答案,然后遍历所有的点,只走权值
大于等于二分值的边是吧。也就是说如果我们加了这条权值为二分值的边,那么U,V就连通了。那么我们可以按权值从大到小排序,
将边连接的两个点加入到带权并查集,并且维护秩,及带秩带权并查集,那么我们查询的时候只用依次向上,直到LCA,取权值的
最小值。写完代码我才发现,我好像写了个最大生成树,由于我这是带秩的,所以询问的时候尽管是暴力,但也是log的。
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define met(a,b) memset(a,b,sizeof a)
#define sys system("pause")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>pii;
const int N = 5e4+;
const int M = 2e5+;
const int mod = 1e9+;
int n,m,k,root;
int dep[N],parent[N];
int dis[N];
vector<pii>vec[N];
struct Edge{
int u,v,cost;
bool operator<(const Edge &e)const{
return cost>e.cost;
}
} edg[M];
int Find(int x){
return x==parent[x]?x:Find(parent[x]);
}
void Union(int x,int y,int w){
x=Find(x);
y=Find(y);
if(dep[x]<=dep[y]){
parent[x]=y;
dis[x]=w;
if(dep[x]==dep[y])dep[y]++;
}
else{
parent[y]=x;
dis[y]=w;
}
}
void dfs(int u){
for(int i=; i<vec[u].size(); i++){
int v=vec[u][i].first;
dep[v]=dep[u]+;
dfs(v);
}
}
int solve(int x,int y){
int ret=;
if(dep[x]<dep[y])swap(x,y);
while(dep[x]>dep[y]){
ret=min(ret,dis[x]);
x=parent[x];
}
while(x!=y){
ret=min(ret,min(dis[x],dis[y]));
x=parent[x];
y=parent[y];
}
return ret;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=; i<=n; i++)parent[i]=i;
for(int i=; i<=m; i++){
scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].cost);
}
sort(edg+,edg+m+);
for(int i=; i<=m; i++){
if(Find(edg[i].u)!=Find(edg[i].v)){
Union(edg[i].u,edg[i].v,edg[i].cost);
}
}
for(int i=; i<=n; i++){
if(parent[i]==i)root=i;
else vec[parent[i]].pb(mp(i,dis[i]));
}
dep[root]=;
dfs(root);
while(k--){
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",solve(u,v));
}
return ;
}
qwb与学姐 (带秩并查集)的更多相关文章
- 石头剪刀布(2019Wannafly winter camp day3 i) 带权并查集+按秩合并 好题
题目传送门 思路: 按照题意描述,所有y挑战x的关系最后会形成一棵树的结构,n个人的总方案数是 3n 种,假设一个人被挑战(主场作战)a次,挑战别人(客场)b次,那么这个人存活到最后的方案数就是3n* ...
- BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...
- qwb与学姐
qwb与学姐 Time Limit: 1 Sec Memory Limit: 128 MB Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅 ...
- 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西 Description 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P ...
- BZOJ4025 二分图 线段树分治、带权并查集
传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...
- hdu3038How Many Answers Are Wrong(带权并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题解转载自:https://www.cnblogs.com/liyinggang/p/53270 ...
- BZOJ4358: permu(带撤销并查集 不删除莫队)
题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...
- poj 1182 (带权并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Description ...
- poj1182 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
随机推荐
- Item 1----------考虑用静态工厂方法代替构造器
读书,有时候,我感觉总是有点绕和不具体.我阅读了代码,理解代码后,才有一种理解和把握的感觉. 优点三. 把某个对象的构建放给客户端来实现. 比如下面的实现,客户端Test,获取Service的实例 ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- C#读取txt文件时中文乱码
解决办法 使用GB2312中文字符集 StreamReader reader = new StreamReader(txtUrl, Encoding.GetEncoding("gb2312& ...
- 如何创建和销毁对象(Effective Java 第二章)
最近有在看Effective Java,特此记录下自己所体会到的东西,写篇博文会更加的加深印象,如有理解有误的地方,希望不吝赐教. 这章主题主要是介绍:何时以及如何创建对象,何时以及如何避免创建对象, ...
- [CTF技巧]批量连接SSH批量执行命令
https://files.cnblogs.com/files/nul1/autossh1.3.jar.zip 下载下来以后直接将后缀去除就好了. 比赛的时候可以批量写一个不死马然后你懂的. Linu ...
- monkey测试===monkeyrunner测试教程(1)
1.安装测试环境 jdk 安装与配置 android sdk安装与配置 Python编辑器安装与配置 以上安装请自行百度教程 Monkeyrunner使用方法 http://www.android-d ...
- (十六)strtok、strtok_s、strtok_r 字符串分割函数
1.strtok函数 函数原型:char * strtok (char *str, const char * delimiters); 参数:str,待分割的字符串(c-string):delimit ...
- 一文看懂IC芯片生产流程:从设计到制造与封装
http://blog.csdn.net/yazhouren/article/details/50810114 芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就 ...
- Kotlin 学习使用之旅(二)
为什么从二开始呢?再此之前已经有了一篇了,那是刚知道kotlin的时候草(chao)来(chao)的并且学习一篇, 这次是自己在项目中正式使用并且遇到的一些问题记录,供kotlin新入门的童鞋参考,避 ...
- Oracle 表连接方式
1.嵌套循环联结(NESTED LOOPS)2.哈希联结(HASH JOIN)3.排序合并联结(MERGE JOIN)4.半联结(in/exists)5.反联结(not in/not exists)6 ...