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 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
随机推荐
- WPF 添加Adminstrator 权限
在WPF应用开发中,需要WPF操作后台注册的Windows Service,可是WIX打包的安装程序不具备赋予WPF App默认管理员权限. 因此,需要我们手工在WPF项目中添加管理员权限: 1.右击 ...
- 例子Architecting Android…The clean way?----代码分析
Presention层: 整个应用启动的时候,就执行依赖的初始化.编译项目之后,Dagger依赖框架使用ApplicationComponent生成一个DaggerApplicationCOmpo ...
- UIAlertView---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIAlertView //转载请注明出处--本文永久链接:http://ww ...
- 【转】使用SQL语句创建和删除约束
转自http://blog.csdn.net/hamber_bao/article/details/6504905 约束的目的就是确保表中的数据的完整性. 常用的约束类型如下: 主键约束:(Prima ...
- Makefile parameters pass 參數傳遞
command $make ARCH=7777777777777777777777777777777 Makefile content $(warning $(ARCH)) output Makefi ...
- python基础===多线程
https://www.cnblogs.com/wj-1314/p/8263328.html threading 模块 先上代码: import time, threading def loop(): ...
- sql server查看创建表的代码,表定义
1.查看建表语句在“对象资源管理器”中找到要导出的表,选中该表并单击右键,“编写表脚本为(S)”/“CREATE到(C)”/“新查询编辑器窗口”即可查看该表的建表语句.2.导出建表语句在“对象资源管理 ...
- ubuntu在vim编辑时,方向键无法正常使用
/* 如果在普通用户下. */ [frankie@localhost ~]$ sudo apt-get install vim [frankie@localhost ~]$ cd /etc/vim [ ...
- 一位资深程序员大牛给予Java初学者的学习建议
这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶 ...
- 【转载】Python: Enum枚举的实现
转自:http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html 从C系语言过来用Python,好不容易适应了写代码不打 ...