最小生成树

最小生成树(MST)(最小连通子图)(算法笔记) 最小生成树是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G的所有顶点,且所有边都是来自图G的边,并且满足整棵树的边权之和最小。 从定义来看,就是要求一个连通方案,使其可以从任一点出发到达连通图的任一点,且这个方案的边权之和需要最小,即求最小连通子图。 阅读详情
0.定义

给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树。如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST)。

1.Prim

假定生成树中最开始只有一个点。然后每次寻找离生成树最近的点,加入生成树。不断进行操作,就可以得到一棵最小生成树了。
如何寻找?可以维护每个点离生成树的距离,加入顶点u时只需查看与u相连的边就行了。想当初最开始写Prim的时候是暴力枚举在树里和没在树里的简直各种浪费时间
详见代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
#define INF 0x3f3f3f3f
using namespace std;
int n,G[maxn][maxn],mincost[maxn],ans;
bool vis[maxn];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&G[i][j]);
    memset(mincost,0x3f,sizeof(mincost));
    mincost[1]=0;
    while(1)
    {
        int u=-1;
        for(int i=1;i<=n;i++)
            if(!vis[i]&&(u<0||mincost[i]<mincost[u])) u=i;
        if(u<0) break;
        vis[u]=true;
        ans+=mincost[u];
        for(int i=1;i<=n;i++)
            mincost[i]=min(mincost[i],G[u][i]);
    }
    printf("%d\n",ans);
}

这样时间复杂度是O(V2)O(V^2)O(V2)的,但是如果用堆来维护mincost复杂度可以变为O(ElogV)O(ElogV)O(ElogV)。然而我似乎并没有写

2.Kruskal

将边按照权值从小到大排序,依次查看。如果边的两个顶点不在同一个连通分量内,就把边加入生成树中。
如何判断两个顶点是否在同一个连通分量?用并查集。
并查集的坑到时候再正儿八经地填上吧QAQ
总之下面就是代码了emmm

#include<cstdio>
#include<algorithm>
#define maxn 105
#define maxm 5100
using namespace std;
int n,m,fa[maxn],ans;
struct edge
{
    int u,v,cost;
}es[maxn];
bool cmp(edge p,edge q) {return p.cost<q.cost;}
void makeset()
{
    for(int i=1;i<=n;i++) fa[i]=i;
}
int findset(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=findset(fa[x]);
}
void unionset(int r1,int r2) {fa[r1]=r2;}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            int x;
            scanf("%d",&x);
            if(i>=j) continue;
            es[++m].u=i;es[m].v=j;es[m].cost=x; 
        }
    sort(es+1,es+m+1,cmp);
    makeset();
    for(int i=1;i<=m;i++)
    {
        int r1=findset(es[i].u),r2=findset(es[i].v);
        if(r1!=r2)
        {
            unionset(r1,r2);
            ans+=es[i].cost;
        }
    }
    printf("%d\n",ans);
}

所以,复杂度就是O(ElogV)O(ElogV)O(ElogV).(but why…

最小生成树算法总结 算法总结第5弹,最小生成树,有关生成树的问题有很多,这里先介绍个最常用的吧。 最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原图的生成树。一般来说,一个图的生成树并不是唯一的(除非原图本身就是一棵树)。 现在考虑带权图G,即图的边带权,则 阅读详情

相关推荐

什么是最小生成树以及如何构建

文章目录一,概念回顾 - 生成树1.1 什么是生成树1.2 如何建立无向图的生成树二,最小生成树(Minimum Spanning Trees)2.1 最小生成树的典型用途2.2 构造最小生成树(MST)2.2.1 MST 性质2.2.2 Prim 算法构建最小生成树2.2.3 Kruskal 算法构建最小生成树2.2.4 Prim 与 Kruskal 算法比较 预习:图的基本概念及图演算法 一,概念回顾 - 生成树 1.1 什么是生成树 生成树:所有顶均由边链接在一起,但不存在回路的图。 多一条边会出现

壮壮不太胖的学习笔记 5391

最小连通-树

树与连通的关系

shuia64649495的博客 435

算法——最小生成树

最小生成树(Minimum Spanning Tree,简称MST)是指一张连通图的子图,它包含图中的所有顶点,并且是图中所有生成树中权值之和最小的一个。最小生成树常用于解决网络设计、电力传输、道路规划等问题。祝您好运!

百锦再的博客 1万+

【周赛总结】1582-1591 最小连通树,差分数组,前缀和+哈希表,拓扑排序转换

文章目录1583.统计不开心的朋友1584.连接所有点的最小费用(最小连通树)1585. 检查字符串是否可以通过排序子字符串得到另一个字符串(思路)1588.所有奇数长度的子串和(低复杂度)1589.所有排列中的最大和(差分数组)1590.使数组和能被P整除1591.奇怪的打印机II(拓扑排序) 1583.统计不开心的朋友 比较暴力的方法,主要考察的还是数据结构。 class Solution { public int unhappyFriends(int n, int[][] preferenc

遍地跑小鸡的博客 273

79.ScottPlot的MVVM实现 C#例子 WPF例子

在你的 WPF 窗口的 XAML 文件中,定义一个,并将其Content属性绑定到 ViewModel 中的属性。这样可以将WpfPlot控件动态绑定到 ViewModel。

S13461120713的博客 2568

关于发那科机器人抓手及物料搬运阀配置

4:确保抓手阀岛和输入模块配网连接正常,MENU—SETUP—MH Valves—Details,详细界面进入到左上图所示,根据每组阀分配夹钳数量并应用。3:设置搬运有效,抓手是否带点焊可以自行选择,要设置应用选择,物料搬用工具数量,工具上阀岛的数量,夹钳存在数量,工具存在数量,以及真空吸盘,冷启动。​2:MENU—应用选择,将搬运置为有效,剩余其他项根据机器人实际用途进行选择。5:设置夹钳数量,检查打开夹钳,检查闭合夹钳,延迟时间要给选择配置应用。

dxs93的博客 4772

克鲁斯卡尔(kruskal)算法——用于求出一个连通图中的最小生成树

通过Kruskal算法与Prim算法的组合使用,工程师可以在不同场景下构建高效的最小生成树解决方案。现代工程实践中,建议将两种算法封装为可互换模块,根据实时输入的图特征动态选择最优算法,这种混合策略在实际项目中可提升30%以上的综合性能。Kruskal算法采用。

m0_54570435的博客 981

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1125

数据结构—— 最小生成树连通网的两种算法区别和用法【普里姆(Prim)算法-克鲁斯卡尔(Kruskal)算法】

目录: 一:最小生成树(Minimum Cost Spanning Tree) 1.定义 成本最小 2.图形化分析 3.分析 二:普里姆算法(Prim算法) 1.定义 2.算法步骤 3.算法简单描写叙述 A:输入: B:初始化: C:反复下列操作,直到Vnew= V: D:输出: 4.图例描写叙述 5.普利姆(Prim)算法适用于求解无向图中的最小生成树 6.简单...

刘鑫磊 1万+

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4885

最小生成树—prime算法

生成树 一个连通图的生成树是该连通图的一个极小连同子图,它含有图中全部顶点,和构成一棵树的(n-1)条边。 如果在一棵生成树上添加任何一条边,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第二条路径。 一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边,但是,有(n-1)条边的图不一定都是生成树。如果一个图有n个顶点和小于(n-1)条边,则是非连通图;如果它有多于(n-1)条边,则一定有回路。 如果图中任意两点都是连通的,那么图被称作连通图。 如果此图是有向图,且双向都有路径,则称为强

weixin_46157720的博客 1万+

微观交通流仿真软件:SUMO (Simulation of Urban MObility)_(8).仿真场景创建与编辑

总结文件()包含了仿真过程中的总体统计信息,如车辆生成数、平均速度等。加载总结文件使用Python的提取关键信息通过以上步骤,可以使用SUMO及其相关工具和库创建和编辑交通仿真场景。无论是手动创建、使用工具转换现有数据,还是通过Python脚本自动生成,SUMO都提供了丰富的功能来满足不同需求。此外,Traci库允许在仿真过程中动态调整交通场景,从而实现更精细的控制和优化。最后,通过对输出文件的分析,可以评估仿真结果并进行进一步的改进。

kkchenjj的博客 1266

prim算法求最小生成树

最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个概念。给定一个连通的无向图,最小生成树是指包含图中所有顶点的一棵树,且该树的所有边的权重之和最小。连通性:最小生成树必须包含图中的所有顶点,并且通过边将它们连接起来,确保整个图是连通的,即任意两个顶点之间都有路径。(一颗有 n 个顶点的生成树有且仅有 n−1 条边,如果生成树中再添加一条边,则必定成环。无环:最小生成树是一棵树,所以不能包含任何环(即回路)。最小权重:最小生成树的边权重之和应当尽可能地小。

sin1810335764的博客 4672

交通仿真软件:SUMO_(13).Python脚本与TraCI接口

通过TraCI接口,用户可以实现与SUMO仿真器的实时交互,获取和控制交通数据。本文档详细介绍了如何使用Python脚本与TraCI接口进行交互,包括基本的设置、数据获取和控制方法。此外,还展示了几个高级应用示例,如交通流优化、多代理系统、车辆路径规划和车辆行为模拟。这些示例可以帮助用户更好地理解如何利用TraCI接口进行复杂的交通仿真和分析。希望这些内容对您有所帮助,如果您有任何问题或需要进一步的帮助,请参考SUMO的官方文档或社区支持。

kkchenjj的博客 989

【PCB专题】Allegro导出3D文件

Allegro中如何导出3D文件,有没有一键导出操作?

一点硬件 4985

MATLAB 最小生成树

本文介绍了 MATLAB 中如何求解最小生成树。

小嗷犬的博客 4426

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最小生成树算法的相关变形题

由于吉大近几年的考试中,算法大题里频繁地出现最小生成树算法的变形题,因此在此整理一下。PS:prim算法不管是画图还是代码题真的难用,kruskal算法才是永远滴神。

销夜的博客 1931

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最小生成树刷题汇总

Acwing 346 走廊泼水节 给定一棵 N 个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。 求增加的边的权值总和最小是多少。 注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。 输入格式 第一行包含整数 tt,表示共有 tt 组测试数据。 对于每组测试数据,第一行包含整数 NN。 接下来 N−1N−1 行,每行三个整数 X,Y,ZX,Y,Z,表示 XX 节点与 YY 节点之间存在一条边,长度为 ZZ。 输出格式 每组数据输出一个整数,表示权值总和最

徒手拆机甲的博客 1932

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

图论:最小生成树

本文介绍了两种最小生成树算法:Prim算法和Kruskal算法。Prim算法采用贪心策略,从节点角度构建最小生成树,通过维护节点到树的距离实现优化,适用于稠密图,时间复杂度为O(V²)或O(ElogV)。Kruskal算法通过边构建最小生成树,使用并查集判断连通性,按边权排序后逐步选择边,适用于稀疏图,时间复杂度为O(ElogE)。文章详细分析了两种算法的实现步骤、模板代码(包括邻接矩阵和邻接表版本)以及适用场景,并通过寻宝问题展示了具体应用。两种算法各有优势,应根据图的稠密程度选择合适的实现方式。

豪德又AC啦 1834

最小生成树详解

本文介绍了最小生成树的概念及其两种主要算法:Kruskal算法和Prim算法。Kruskal算法通过按边权排序并利用并查集避免环来构建最小生成树,适合稀疏图;Prim算法则从原点出发逐步扩展最近节点,适合稠密图。文章还通过多个例题(如繁忙的都市、无线通讯网等)展示了算法的应用,并介绍了超级源点等技巧。最后强调深入理解树结构是解决此类问题的关键,建议通过多做题来提高解题能力。不同问题需要灵活选择算法,构建特殊的最小生成树来满足需求。

joezhoutj的博客 817

最小生成树的一些性质和理解

1)       定义在一棵树里添加一条边,并在产生的圈里删除一条边叫做一次操作。(也就是说换掉一条边并且保证结果是树),则树A和B是无向图的两个生成树,则A可以通过若干次操作变成B。   证:把树看作边的集合,如果B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。

zengchenacmer的专栏 9133

图论——最小生成树

最小生成树(MinimumSpanningTrees)的概念连通图的一颗生成树(SpanningTree)是包含图的所有顶点的连通无环子图(也就是一棵树)。加权连通图的一颗最小生成树是图的一颗权重最小的生成树,其中,树的权重定义为所有边的权重总和。)将加权图每个顶点都看做森林,然后将图中每条邻接边的边权按照升序的方式进行排列,接着从排列好的邻接边表中抽取边权最小的边,写入该边的起始顶点和结束顶点,连接顶点将森林构成树,然后读取起始结束顶点的邻接边,优先抽取边权小的邻接边,继续连接顶点将森林构成树。...

faith_xy的博客 3765
上一篇: poj-3061-Subsequence & 尺取法
下一篇: 51nod-1305-Pairwise Sum and Divide
dogeding
博客等级 码龄10年 31粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值