qwb与学姐

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 149  Solved: 54
[Submit][Status][Web Board]

Description

qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:
已知一幅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

对于每个询问输出一行,一共k行,每行输出A点到B点的所有路径的值的最大值。

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与学姐 (带秩并查集)的更多相关文章

  1. 石头剪刀布(2019Wannafly winter camp day3 i) 带权并查集+按秩合并 好题

    题目传送门 思路: 按照题意描述,所有y挑战x的关系最后会形成一棵树的结构,n个人的总方案数是 3n 种,假设一个人被挑战(主场作战)a次,挑战别人(客场)b次,那么这个人存活到最后的方案数就是3n* ...

  2. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  3. qwb与学姐

    qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MB Description qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:已知一幅 ...

  4. 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏

    算是挺基础的东西 Description     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P ...

  5. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

  6. hdu3038How Many Answers Are Wrong(带权并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题解转载自:https://www.cnblogs.com/liyinggang/p/53270 ...

  7. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  8. poj 1182 (带权并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 71361   Accepted: 21131 Description ...

  9. poj1182 食物链 带权并查集

    题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...

随机推荐

  1. Java包名命名规则

    1.  sun公司建议java包的命名规则为域名的倒写. 比如:sun公司www.sun.com 就用该是com.sun.www 2. indi : 个体项目,指个人发起,但非自己独自完成的项目,可公 ...

  2. Redis 键值数据类型及基本操作

    到目前为止,Redis 支持的键值数据类型如下: 字符串(String) 哈希(Map) 列表(list) 集合(sets) 有序集合(sorted sets)   1. String 字符串类型 s ...

  3. 用vue快速开发app的脚手架工具

    前言 多页面应用于结构较于简单的页面,因为简答的页面使用router又过于麻烦.本脚手架出于这样的场景被开发出来. 使用脚手架搭配Hbuilder也同样可以快速使用vue开发安卓和IOS APP. 本 ...

  4. spring 那点事

    Spring核心功能 DI(IOC) 何谓DI(IOC) DI(依赖注入)是spring的核心功能之一. Dependency Injection 和 Inversion of Control 其实就 ...

  5. Python ctypes 在 Python 2 和 Python 3 中的不同 // 使用ctypes过程中问题汇总

    In Python 2.7, strings are byte-strings by default. In Python 3.x, they are unicode by default. Try ...

  6. Java常用开发思想与知识点小记(一)

    1.   子类在覆盖父类的方法时,不能抛出比父类更多的异常(儿子不能比父亲干更多的坏事),所以只能捕捉异常,通常在web层捕获异常,给用户一个友好提示. 2.Java内存模型与并发编程三个特性 htt ...

  7. 第三周main参数传递-1 课堂测试

    课堂测试 main参数传递-1 测试 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成"求命令行传入整数参数的 ...

  8. sublime3插件安装及报错处理

    ctrl+shift+p调用出窗口:输入install package,然后输入想安装的插件. 有些用户安装的可能是国内破解版的,我的就是,然后install package报错: Package C ...

  9. esp8266 IOT Demo 固件刷写记录

    将编译好的固件按照下面地址刷写到esp8266 出现下面错误是因为刷写的设置不对,按照图上设置: load 0x40100000, len 26828, room 16 tail 12chksum 0 ...

  10. java===java基础学习(10)---对象构造

    重载 如果多个方法有相同的名字,不同的参数,便产生了重载.编译器必须挑选出具体执行哪个方法,他通过用各个方法给出的参数类I型那个与特定方法调用所使用的值类型进行匹配来挑选出相应的方法.如果编译器找不到 ...