[算法模板]Kruskal重构树
[算法模板]Kruskal重构树
kruskal重构树是一个很常用的图论算法。主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小。
图片来自Kruskal重构树学习笔记+BZOJ3732 Network

从上图我们可以看出,kruskal重构树有以下特质:
- 每个原图上的节点一一对应重构树上的叶子节点。
 - 重构树上每一个其他节点(正方形)代表原图上的一个边,有点权。
 - 重构树是一棵二叉树。
 - 重构树是一个二叉堆。(所以两个叶子节点的LCA即为路径上的最大边)
 
那如何建树呢?显然,在kruskal基础上搞一搞就行了:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 25000
struct gg{
    int u,v,w;
}side1[maxn*2];
vector<int> side2[maxn*4];
bool cop(gg x,gg y){return x.w<y.w;}
int ncnt,num[maxn*4],n,m,k,head[maxn],cnt,dep[maxn*4],f[maxn*4][21],fa[maxn*4];
int get(int x){
    if(fa[x]==x)return x;
    fa[x]=get(fa[x]);
    return fa[x];
}
void uni(int x,int y,int w){
    int gx=get(x),gy=get(y);
    if(gx==gy)return;
    ncnt++;num[ncnt]=w;
    side2[ncnt].push_back(gx);side2[ncnt].push_back(gy);side2[gx].push_back(ncnt);side2[gy].push_back(ncnt);
    fa[gx]=fa[gy]=fa[ncnt]=ncnt;
    return;
}
void dfs(int u,int g){
    dep[u]=dep[g]+1;f[u][0]=g;
    for(int i=1;i<=20;i++)f[u][i]=f[f[u][i-1]][i-1];
    for(int i=0;i<(int)side2[u].size();i++){
        int v=side2[u][i];if(v==g)continue;
        dfs(v,u);
    }
    return;
}
int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    for(int i=20;i>=0;i--)if(dep[f[u][i]]>=dep[v])u=f[u][i];
    if(u==v)return u;
    for(int i=20;i>=0;i--)if(f[u][i]!=f[v][i]){u=f[u][i];v=f[v][i];}
    return f[u][0];
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++){
        int u,v,w;scanf("%d%d%d",&u,&v,&w);
        side1[i]=(gg){u,v,w};
    }
    for(int i=0;i<=n;i++){fa[i]=i;}
    ncnt=n;
    sort(side1+1,side1+1+m,cop);
    for(int i=1;i<=m;i++){
        if(get(side1[i].u)==get(side1[i].v))continue;
        uni(get(side1[i].u),get(side1[i].v),side1[i].w);
    }
    dfs(ncnt,0);
    for(int i=1;i<=k;i++){
        int a,b;scanf("%d%d",&a,&b);
        printf("%d\n",num[lca(a,b)]);
    }
    return 0;
}
												
											[算法模板]Kruskal重构树的更多相关文章
- 算法学习——kruskal重构树
		
kruskal重构树是一个比较冷门的数据结构. 其实可以看做一种最小生成树的表现形式. 在普通的kruskal中,如果一条边连接了在2个不同集合中的点的话,我们将合并这2个点所在集合. 而在krusk ...
 - [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
		
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
 - BZOJ 3732 Network 【模板】kruskal重构树
		
[题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...
 - kruskal重构树学习笔记
		
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
 - Kruskal重构树入门
		
这个知识点好像咕咕咕了好长了..趁还没退役赶紧补一下吧.. 讲的非常简略,十分抱歉.. 前置知识 Kruskal算法 一定的数据结构基础(如主席树) Kruskal重构树 直接bb好像不是很好讲,那就 ...
 - 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 ...
 - 2018.07.18 [NOI2018]归程(return)(kruskal重构树)
		
传送门 新鲜出炉的noi2018试题. 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东. 听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但 ...
 - [NOI2018]归程 kruskal重构树
		
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
 
随机推荐
- 利用开源项目 FFMpegSharp 实现音视频提取、转码、抓图等操作
			
开源项目地址:https://github.com/vladjerca/FFMpegSharp 首先需要在 web.config 或 app.config 中配置 <appSettings> ...
 - 在 ubuntu 下如何压缩与解压 7zip 文件。
			
1. 首先利用 ubuntu 软件中心搜索并下载 7zip.或者在终端中输入:sudo apt-get install p7zip 2. 压缩 3. 解压 谢谢浏览!
 - 基于 HTML5 换热站可视化应用
			
换热站是整个热网系统中最核心的环节,它将一侧蒸汽或高温水通过热交换器换成可以直接进入用户末端的采暖热水.换热站控制系统是集中供热监控系统的核心部分,换热站控制系统既可独立工作,也可以接受调度中心的监督 ...
 - notepad++格式化代码,自动对齐
			
Notepad++本身没有快捷命令格式化JavaScript代码,需要通过安装扩展插件来实现快捷格式化JS代码的功能.本文主要介绍如何通过安装JStool插件来实现格式化JS代码的功能. 在插件列表中 ...
 - 简单的sql语句汇总(sqlserver)
			
1.修改字段的默认值 alter table 表名 add default 默认值 for 字段名称 例子: for Age; alter table 表名 add constraint DF_TAB ...
 - Spring Cloud入门
			
Spring Cloud为开发者开发分布式应用提供了便捷工具(包括配置管理.服务发现.断路器.智能路由.微服务代理.控制总线.一次性令牌.全局锁.领导者选举.分布式会话.集群状态等).为开发分布式应用 ...
 - 【转载】Gradle学习 第七章:Java快速入门
			
转载地址:http://ask.android-studio.org/?/article/22 7.1. The Java plugin(Java插件) As we have seen, Gradle ...
 - REDELK的安装和使用
			
0x00 前言简介 红队的SIEM有两个主要目标: 通过创建一个集中管理中心,收集和丰富来自多个 teamservers的所有相关操作日志,增强了红队人员的可用性和概述.这对于在操作中进行历史搜索以及 ...
 - Android 中发送邮件
			
第一步.导入第三方jar包 Android实现发送邮件,首先需要依赖additional.jar.mail.jar和activation.jar这3个jar包. Google提供了下载地址:https ...
 - DEDECMS安全设置篇
			
dedecms是好用,优化也好,就是不安全,个人是这样认为的,今天 闲着没事 整理了一些有助于dedecms网站安全的一些设置,可以说是目前最全的dedecms安全设置! 其一:保持DEDE更新,及时 ...