BZOJ3732 Network(Kruskal重构树)
Kruskal重构树的模板题。
给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).
现在有 K个询问 (1 < = K < = 20,000)。
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e5+10,INF=1e9,B=19;
4 inline int read(){
5 char c=getchar();int x=0,f=1;
6 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
7 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
8 return x*f;
9 }
10 int fa[N],f[N][21],ch[N][21],cnt,val[N],dep[N];
11 int n,M,K;
12
13 struct Edge{
14 int u,v,w;
15 bool operator< (const Edge &rhs) const {
16 return w<rhs.w;
17 }
18 }E[N];
19 int num=0;
20
21 inline void add(int x,int y,int z){
22 E[++num]=(Edge){x,y,z};
23 }
24
25 int find(int x){
26 if(fa[x]==x) return fa[x];
27 else return fa[x]=find(fa[x]);
28 }
29
30 void Kruskal(){
31 sort(E+1,E+num+1);//按边的权值排序
32 int tot=0;
33 for(int i=1;i<=M;i++){
34 int x=E[i].u,y=E[i].v;
35 int fx=find(x),fy=find(y);
36 if(fx!=fy){//建树
37 ch[++cnt][0]=fx,ch[cnt][1]=fy;
38 fa[fa[x]]=fa[fa[y]]=f[fa[x]][0]=f[fa[y]][0]=cnt;
39 val[cnt]=E[i].w;//边权转化为点权
40 }
41 }
42 }
43
44 void dfs(int x){//求深度
45 if(!ch[x][0]&&!ch[x][1]) return ;//叶子节点
46 dep[ch[x][0]]=dep[ch[x][1]]=dep[x]+1;
47 dfs(ch[x][0]);dfs(ch[x][1]);
48 }
49
50 int LCA(int x,int y){//倍增求LCA
51 if(dep[x]<dep[y]) swap(x,y);
52 for(int i=B;i>=0;i--){
53 if(dep[f[x][i]]>=dep[y])
54 x=f[x][i];
55 }
56 if(x==y) return x;
57 for(int i=B;i>=0;i--){
58 if(f[x][i]!=f[y][i])
59 x=f[x][i],y=f[y][i];
60 }
61 return f[x][0];
62 }
63
64 main(){
65 cnt=n=read();M=read();K=read();
66 for(int i=1;i<=n<<1;i++) fa[i]=i;//初始化
67 for(int i=1;i<=M;i++){
68 int x=read(),y=read(),z=read();
69 add(x,y,z);
70 }
71 Kruskal();//重构树
72 dep[cnt]=1;dfs(cnt);//cnt重构完后所有的节点数,也是当前的根节点
73 for(int i=1;i<=B;i++){
74 for(int j=1;j<=2*N;j++)
75 f[j][i]=f[f[j][i-1]][i-1];//ST表
76 }
77 while(K--){
78 int x=read(),y=read();
79 cout<<val[LCA(x,y)]<<endl; //答案就是x,y最近公共祖先的点权
80 }
81 return 0;
82 }
BZOJ3732 Network(Kruskal重构树)的更多相关文章
- BZOJ3732: Network(Kruskal重构树)
题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...
- [bzoj 3732] Network (Kruskal重构树)
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...
- 【BZOJ 3732】 Network Kruskal重构树+倍增LCA
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...
- BZOJ3732 (Kruskal重构树)
Kruskal重构树上\(x\)和\(v\)的\(lca\)的权值即为它们最长路最小值 #include <cstdio> #include <iostream> #inclu ...
- BZOJ 3732: Network Kruskal 重构树
模板题,练练手~ Code: #include <cstdio> #include <algorithm> #define N 80000 #define setIO(s) f ...
- Kruskal重构树学习笔记+BZOJ3732 Network
今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...
- 【BZOJ】3732: Network【Kruskal重构树】
3732: Network Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2812 Solved: 1363[Submit][Status][Dis ...
- BZOJ 3732 Network 【模板】kruskal重构树
[题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...
- Kruskal重构树+LCA || BZOJ 3732: Network
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=3732 题解:Kruskal重构树板子 代码: #include<cstdio> ...
随机推荐
- Dubbo源码(五) - 服务目录
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊聊Dubbo的服务目录(Directory).下面是官方文档对服务目录的定义: 服务目 ...
- 无法访问mybatis.dto.StudengInVO-使用maven编译报错-2022新项目
一.问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO. 突然出现这个错误让自己感觉很奇怪, ...
- MYSQL的Java操作器——JDBC
MYSQL的Java操作器--JDBC 在学习了Mysql之后,我们就要把Mysql和我们之前所学习的Java所结合起来 而JDBC就是这样一种工具:帮助我们使用Java语言来操作Mysql数据库 J ...
- LuoguP3128 [USACO15DEC]最大流Max Flow (树上差分)
跟LOJ10131暗的连锁 相似,只是对于\(lca\)节点把它和父亲减一 #include <cstdio> #include <iostream> #include < ...
- [CSharpTips]C#读取SQLite数据库中文乱码
C#读取SQLite数据库中文乱码 C#在读取C++写入数据的Sqlite数据库中的Text内容时,会出现乱码,因为C++默认编码格式为GB2312,而Sqlite编码格式为UTF-8,存入时不统一就 ...
- Python自动化之常用模块学习
自动化常用模块 urllib和request模块学习笔记 '获取页面,UI自动化校验页面展示作用': #-*- coding : utf-8 -*-import urllib.requestimpor ...
- Learn Dijkstra For The Last Time
博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法. 市面上的大部分教程都仅 ...
- anltr 解析MYSQL
String sql = "select a as c,b as s,'zhange' F, 1/5 as e from t_order"; final MysqlQueryLex ...
- 分布式版本控制系统Git的使用;
1.什么是Git Git是一个分布式的版本控制软件: 软件,类似于qq.office等安装到电脑才能使用的工具. 版本控制,类似于毕业论文,视频剪辑等需要反复修改和保留原历史数据: 分布式 文件夹拷贝 ...
- 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)
0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...