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重构树)的更多相关文章

  1. BZOJ3732: Network(Kruskal重构树)

    题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...

  2. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

  3. 【BZOJ 3732】 Network Kruskal重构树+倍增LCA

    Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...

  4. BZOJ3732 (Kruskal重构树)

    Kruskal重构树上\(x\)和\(v\)的\(lca\)的权值即为它们最长路最小值 #include <cstdio> #include <iostream> #inclu ...

  5. BZOJ 3732: Network Kruskal 重构树

    模板题,练练手~ Code: #include <cstdio> #include <algorithm> #define N 80000 #define setIO(s) f ...

  6. Kruskal重构树学习笔记+BZOJ3732 Network

    今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...

  7. 【BZOJ】3732: Network【Kruskal重构树】

    3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Dis ...

  8. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

  9. Kruskal重构树+LCA || BZOJ 3732: Network

    题面:https://www.lydsy.com/JudgeOnline/problem.php?id=3732 题解:Kruskal重构树板子 代码: #include<cstdio> ...

随机推荐

  1. 使用codeblocks创建新项目

    很多同学在学习C或C++版的数据结构的时候,自己写项目是一个不错的锻炼方法,而用codeblocks写项目的时候我们就会遇到很多问题了,比如说: 1.如何建立新项目. 2.如何建立头文件和主函数文件. ...

  2. 【RocketMQ】消息的消费

    上一讲[RocketMQ]消息的拉取 消息消费 当RocketMQ进行消息消费的时候,是通过ConsumeMessageConcurrentlyService的submitConsumeRequest ...

  3. 【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)

    文章有点长,耐心看完应该可以懂实际原理到底是啥子. 这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期. 当然,这个其实也算是NoSQL ...

  4. 记一次 .NET 某智慧物流 WCS系统 CPU 爆高分析

    一:背景 1. 讲故事 哈哈,再次见到物流类软件,上个月有位朋友找到我,说他的程序出现了 CPU 爆高,让我帮忙看下什么原因,由于那段时间在苦心研究 C++,分析和经验分享也就懈怠了,今天就给大家安排 ...

  5. ABC251 题解

    典中典比赛 . 目录 A - Six Characters B - At Most 3 (Judge ver.) C - Poem Online Judge D - At Most 3 (Contes ...

  6. 7 行代码搞崩溃 B 站,原因令人唏嘘!

    前不久,哔哩哔哩(一般常称为 B 站)发布了一篇文章<2021.07.13 我们是这样崩的>,详细回顾了他们在 2021.07.13 晚上全站崩溃约 3 小时的至暗时刻,以及万分紧张的故障 ...

  7. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

  8. 趣味问题《寻人启事》的Python程序解决

    偷懒了很久,今天我终于又来更新博客了~ 最近,我看到了一个趣味问题,或者说是数学游戏:<寻人启事>. 在表述这个问题前,我们需要了解一下"冰雹猜想": 对于任意一个正整 ...

  9. 线程本地存储 ThreadLocal

    线程本地存储 · 语雀 (yuque.com) 线程本地存储提供了线程内存储变量的能力,这些变量是线程私有的. 线程本地存储一般用在跨类.跨方法的传递一些值. 线程本地存储也是解决特定场景下线程安全问 ...

  10. 大家都能看得懂的源码 - ahooks useSet 和 useMap

    本文是深入浅出 ahooks 源码系列文章的第十篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 今天我们来聊聊 ahooks 中对 Map 和 Set 类型进行状 ...