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 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
随机推荐
- LightOJ 1097 - Lucky Number 线段树
http://www.lightoj.com/volume_showproblem.php?problem=1097 题意:一个自然数序列,先去掉所有偶数项,在此基础上的序列的第二项为3,则删去所有3 ...
- Codeforces Round #380 (Div. 2)/729B Spotlights 水题
Theater stage is a rectangular field of size n × m. The director gave you the stage's plan which act ...
- 「模板」AC自动机(ACAM)
#include <algorithm> #include <cstdio> #include <cstring> #include <queue> u ...
- iOS排序
NSArray *originalArray = @[@,@,@,@,@]; //block比较方法,数组中可以是NSInteger,NSString(需要转换) NSComparator finde ...
- Django ORM常用的函数以及修饰词
函数名称或修饰词 说明 filter() 返回符合指定条件的QuerySet exclude() 返回不符合指定条件的QuerySet ordey_by() 串接到QuerySet之后,针对某一指定的 ...
- truncate与delete以及drop
truncate:删除整个表,但不删除定义(删除了整个表的数据,但表结构还在) drop:删除整个表,表数据和表结构都删除了 delete:删除表中数据 比较delete和drop 1.truncat ...
- Item27--优先考虑泛型方法
类型推导:发生在以下三个地方.1.Java编译器根据泛型方法传入的参数,推导出具体的类型.2.Java编译器,根据泛型构造器传入的类型来推导出实际要构造的实例类型.3.Java编译器根据表达式的目标类 ...
- sscanf的用法
sscanf也太好用了8我竟然一直都不知道qaq #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
- 「6月雅礼集训 2017 Day7」回转寿司
[题目大意] 给一个n个数的序列,q次操作,每次选择区间$[l,r]$,给出数p,对于区间$[l,r]$的每个数$x$,做如下操作: 如果$x > p$,就交换$x$和$p$.求每次操作后$p$ ...
- CODE FESTIVAL 2017 qual B C - 3 Steps
Score : 500 points Problem Statement Rng has a connected undirected graph with N vertices. Currently ...