首页 > 其他分享 >Kruskal 重构树

Kruskal 重构树

时间:2023-08-04 23:55:46浏览次数:37  
标签:重构 Kruskal 二叉树 节点 边权 虚点

Kruskal 重构树

1.概念

在进行Kruskal算法求解最小生成树时,添加若干虚点,使求得的树成为二叉树,二叉树的叶子节点为原图中存在的节点,且每个虚点都有一个权值,为左子树中的点到右子树中的点的简单路径的最大边权。

2.实现方法

仍然按照Kruskal算法按照边权从小到大加入边:

1.新建n个集合,每个集合图中为一个节点,点权为0.

2.按照边权从小到大顺序遍历边。

3.判断当前这条边的两个顶点是否在同一集合中,若不是,则新建一个虚点,点权为当前边的权值,左右儿子分别为这两个集合的根节点,然后将两个集合合并,设其根节点为新添加的这个点。

3.几点性质和应用

  • 重构树有\(n\)个叶子节点,则此二叉树的内点为\(n - 1\)个,整个二叉树节点数为\(2n - 1\)

  • 原生成树中两个节点之间简单路径的最大边权即为重构树中这两个点的最近公共祖先。

  • 假设给定某个值,求从某个点出发只通过边权小于等于这个值的边可以到达的定点数,可以从这个顶点不断往上跳找到最后一个权值小于等于这个值的虚点,其子树的叶节点树即为答案。使用树上倍增可以压缩至\(O(logn)\)

4.实现代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
struct edge {
    int from, to, w;
    friend bool operator < (const edge &x, const edge &y) {
        return x.w < y.w;
    }
} edg[N];
vector <int> e[N << 1];
int fa[N << 1];
int nodetot, n, root, val[N << 1];
void add(int x, int y) {
    e[x].push_back(y);
}
int find(int x) {
    return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
void kruskal() {
    for(int i = 1; i <= 2 * n; i++) {
        fa[i] = i;
    }
    nodetot = n;
    sort(edg + 1, edg + n);
    for(int i = 1; i < n; i++) {
        int fa1 = find(edg[i].from), fa2 = find(edg[i].to);
        if(fa1 != fa2) {
            nodetot++;
            val[nodetot] = edg[i].w; 
            fa[fa1] = fa[fa2] = nodetot;
            add(nodetot, fa1); add(nodetot, fa2);
        }
    }
    root = nodetot;
}

标签:重构,Kruskal,二叉树,节点,边权,虚点
From: https://www.cnblogs.com/mcggvc/p/17607310.html

相关文章

  • 【博客重构之路】webman-admin安装指南
    原文地址【博客重构之路】webman-admin安装指南视频地址【bilibili】webman是什么webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构,提供超高性能可扩展的HTTP服务。你可以用webman开发网站,也可以开发HTTP接口或者微服务。除此之外,webma......
  • 高质量代码究竟依赖设计还是重构而来?
    点击链接了解详情导读一个有所追求的程序员一定都希望自己能够写出高质量的代码,但高质量代码从何而来呢?有人认为是设计出来的,就像一栋稳固的大厦,如果没有前期优秀的设计那么肯定难逃豆腐渣工程的命运;也有人认为是重构出来的,软件的一个基本特性就是易变,随着时间的推移软件会不......
  • 重构之Divergent Change(发散式变化)&Shotgun Surgery (散弹式修改)
    5.DivergentChange发散式变化描述:一个类被锚定了多个变化,当这些变化中的任意一个发生时,就必须对类进行修改。解释:一个类最好只因一种变化而被修改操作:你应该找出某特定原因而造成的所有变化,然后运用ExtractClass将它们提炼到另一个类中。6.ShotgunSurgery散弹式修改描述:一种变化......
  • VUE3、ElementPlus 重构若依vue2 表单构建功能
    Vue3+ElementPlus+Vite重构若依Vue2表单构建功能若依官方的Vue3版本发布已经有段时间了,就是这个表单构建功能一直没有安排计划去适配到Vue3!前段时间公司需要做个类似的功能,就直接借鉴若依Vue2的来直接改了吐槽下:vuedraggable-vue3坑真多,官方文档一言难尽,现在不推荐使......
  • mysql 简单进阶 ———— 重构查询[二]
    前言简单整理一下重构查询。正文为什么我们需要重构查询,原因也很简单,那就是查询慢。为什么会查询慢?查询性能慢底下的最基本的原因是访问的数据太多。某些查询不可避免地需要筛选大量的数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据流的方式进行优化。......
  • kruskal 最小生成树
    建最小生成树还有一个基于并查集的算法——kruskal算法它的思路是从小到大枚举所有的边,如果这条边的两点的老祖宗不相等,这两点至少有一个不在树中,我们就把它算进去时间复杂度是O(mlogm),和H-prim一样。两者都适合用在稀疏图中,prim适合在稠密图例题洛谷P3366【模板】最小生成......
  • 趣图|代码重构前vs重构后
    前言很多程序员对自己写的代码平时很随心所欲,但当有一天让他维护他人的代码,他就会抓狂,很容易激发他体内重构的瘾。(大多数程序员审阅完别人代码后,先会忍不住吐槽一番,然后会忍不住想重构一把,......
  • .NET项目重构之日志服务(Serilog)
    1.目录1.目录2.前言2.1.日志控件的选择3.日志配置3.1.控制台打印3.2.文件打印4.结语2.前言定时任务中比较重要的一个环节就是日志记录,有了日志可以记录系统的操作过程,也可以在系统异常时方便排查错误原因。比如定时任务经常要做的一个事情,同步其它异构......
  • 中小企业建设数字化工厂,选择集成老路还是整体重构?
    本文分享自华为云社区《中小企业建设数字化工厂,选择集成老路还是整体重构?》,作者:云起MAE。中小制造企业建设数字化工厂,需要从中小企业数字化建设应从业务和管理的痛点出发,以经济实用为目标。面临目前市场需求的多样性和不确定性,“多品种小批量个性化定制”的新制造模式成为常态,......
  • IDEA代码重构技巧 – 抽取+内联
    IDEA代码重构技巧--抽取+内联1.抽取在做代码重构时,可能发现我们需要将变量,参数做抽取,或者某个方法过长,需要将这个方法中相同逻辑的代码块抽取出一个独立的函数,这时候就需要使用抽取,抽取有三类:抽变量,IDEA快捷键CTRL+ALT+V抽参数,IDEA快捷键CTRL+ALT+P抽函数,IDEA快捷键CTRL+......