最小生成树 Kruskal算法 Prim算法 洛谷P3366

2023-05-16

最小生成树 Kruskal算法 Prim算法 洛谷P3366

相较于Prim算法,我觉得Kruskal算法更优(因为一般情况,题目给你的边数都是正常的,Kruskal算法的时间复杂度为O(ElogE) E为边的数量),Kruskal算法是将边按权值排序之后利用并查集进行加边,直至加入边的数量为n-1时结束,而Prim算法是每一次加入一个点,使用的是邻接表进行加点,其时间复杂度为O(n^2),n为点的数量。

当然Prim算法经过优化后也是很强大的: Prim算法循环 n - 1,每次都要寻找距离集合Vnew的最小值, 扫描与一个点所连接的所有边。如果使用将一个点所有的边都扫描一遍的算法,则时间复杂度为O(n² + E)。如果我们使用二叉堆来实现查找距离集合Vnew的最小值,则时间复杂度为O(E logV )。如果使用斐波那契堆优化的话,那么时间复杂度将可以近一步优化为O( E + V logV)。

所以,Prim算法适用于点很少,但是边很多的情况,即适用于稠密图的情况,相反Kruskal适用于边很少但点很多的情况。

以洛谷的这个模板题来说,两者均适用

Kruskal算法:

#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n,m,tot=0,k=0;
int fat[maxn];//并查集
struct Node{
    int fr,to,dis;
    bool operator <(const Node x)const{
        return dis<x.dis;
    }
}Edge[maxn];
int fa(int x){
    if(fat[x]!=x)
        return fa(fat[x]);
    return x;
}
void connect(int x,int y){
    fat[fa(y)]=fa(x);
}
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d %d %d",&Edge[i].fr,&Edge[i].to,&Edge[i].dis);
    for(int i=1;i<=n;i++)
        fat[i]=i;//并查集初始化
    sort(Edge+1,Edge+1+m);//将边按权值排序
    for(int i=1;i<=m;i++){
        if(k==n-1)    break;//边数达到n-1时就退出
        if(fa(Edge[i].fr) != fa(Edge[i].to)){
            connect(Edge[i].fr,Edge[i].to);//将两个点用并查集连接起来
            tot+=Edge[i].dis;//加上加入边的边权
            k++;//边数++
        }
    }
    printf("%d",tot);//输出最小生成树的权值
return 0;
}

Prim算法(未优化):Prim算法可以通过二叉堆将时间复杂度优化到O(ElogV),斐波那契堆更是可以优化到O(E+VlogV),这些版本我之后再补吧。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
#define maxn 5005
#define maxm 200005
struct edge{
    int v,w,next;
}e[maxm<<1];
int head[maxn],dis[maxn],cnt,n,m,tot,now=1,ans;
bool vis[maxn];
inline int read(){
	int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
inline void add(int u,int v,int w){
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}//向前星邻接表
inline void init(){
    n= read(),m= read();
    for(  int i=1,u,v,w;i<=m;++i){
        u= read(),v= read(),w= read();
        add(u,v,w),add(v,u,w);//建立邻接表
    }
}
inline int prim(){
    for(int i=2;i<=n;++i)
        dis[i]=inf;
    for(int i=head[1];i;i=e[i].next)
        dis[e[i].v]=min(dis[e[i].v],e[i].w);//更新所有剩余的点到当前节点的距离
    while(++tot<n){
        int minn=inf;
        vis[now]=1;
        for(int i=1;i<=n;++i)
            if(!vis[i]&&minn>dis[i])
                minn=dis[i],now=i;//首先从起始位置选出一个离我们需要的点集最近的点
        ans+=minn;
        for(int i=head[now];i;i=e[i].next){
            int v=e[i].v;
            if(dis[v]>e[i].w&&!vis[v])
                dis[v]=e[i].w;//更新所有剩余的点到当前节点的距离
        }
    }
return ans;
}
int main(){
    init();
    printf("%d",prim());
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小生成树 Kruskal算法 Prim算法 洛谷P3366 的相关文章

  • 洛谷——P3366 【模板】最小生成树

    题目描述 如题 xff0c 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出orz 输入格式 xff1a 第一行包含两个整数N M xff0c 表示该图共有N个结点和M条无向边 xff08 N lt
  • 洛谷 P3366 【模板】最小生成树

    洛谷 P3366 模板 最小生成树 题目 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出orz 题目链接 模板 最小生成树 洛谷 输入 第一行包含两个整数N M xff0c 表示该图共有N个结点和
  • 最小生成树+思维 扩散(洛谷 P1661)

    扩散 题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离 xff0c 如图 图略 两个点a b连通 xff0c 记作e a b 当且仅当a b的扩散区域有公共部分 连通块的定义是块内的任意两个点u v都必定存在路径e u a0 e
  • 洛谷 P3366 【模板】最小生成树 (题解+代码)

    题目传送门 xff1a https www luogu com cn problem P3366 题解 xff1a 利用Kruskal算法求解 xff0c 这里大致说下Kruskal算法 对于一个点数为n的生成树而言 很显然 xff0c 想
  • 洛谷P3366 【模板】最小生成树.Prim算法

    题目 xff1a https www luogu com cn problem P3366 普利姆算法 xff1a 每次选 与已选的点相连的 最小边 循环n 1次 C语言 xff1a include lt stdio h gt includ
  • LOJ #10066. 「一本通 3.1 练习 1」新的开始(最小生成树 虚拟节点)

    题目链接 题目描述 发展采矿业当然首先得有矿井 xff0c 小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n口矿井 xff0c 但他似乎忘记考虑的矿井供电问题 为了保证电力的供应 xff0c 小 FF 想到了两种办法 xff1a
  • 洛谷-U132410-最小代价(最小生成树(森林)+ 虚拟点)

    题目描述 xff1a 点击进入 思路 最小生成树的变形 我们虚拟一个 零 结点 xff0c 这个结点跟每个村庄 i 连边 xff0c 权值分别为在村庄 i 建立一个网络中心的花费 然后其他边都正常连 xff0c 最后求最小生成树即可 代码
  • P4180 [BJWC2010]严格次小生成树(kruskal + 倍增 + lca)

    思路 xff1a xff08 1 xff09 先求最小生成树 xff0c 重新建图 xff08 2 xff09 遍历所有非树边 xff0c 用树上倍增求LCA的方法求出非树边两节点之间树边中的最大边和次大边 xff0c 再将非树边权值与最大
  • [BJWC2010] 严格次小生成树(kruskal+树剖)

    这题果然是模板题 一堆做法 但是根本思想是一样的 都是先跑一遍最小生成树 xff0c 然后维护一下路径上最大值和小于最大值的最大值 主要的实现方法有三种 1 kruskal 43 倍增 43 lca 复杂度是 O m l o
  • 洛谷P3366最小生成树模板

    kruskal span class token macro property span class token directive keyword include span span class token string lt cstdi
  • 最小生成树模板 洛谷 Prim算法和Kruskal算法

    洛谷 最小生成树模板 题目描述 如题 xff0c 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出 orz 输入格式 第一行包含两个整数 N M xff0c 表示该图共有 N 个结点和 M 条无向边
  • 洛谷 P3366 【模板】最小生成树

    题目描述 如题 xff0c 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出orz 输入输出格式 输入格式 xff1a 第一行包含两个整数N M xff0c 表示该图共有N个结点和M条无向边 xff
  • 最小生成树之Kruskal算法

    给定一个无向图 xff0c 如果它任意两个顶点都联通并且是一棵树 xff0c 那么我们就称之为生成树 Spanning Tree 如果是带权值的无向图 xff0c 那么权值之和最小的生成树 xff0c 我们就称之为最小生成树 MST Min
  • 数据结构:最小生成树--Prim算法

    最小生成树 Prim算法 最小生成树 给定一无向带权图 顶点数是n 要使图连通只需n 1条边 若这n 1条边的权值和最小 则称有这n个顶点和n 1条边构成了图的最小生成树 minimum cost spanning tree Prim算法
  • Connect the Cities 【HDU - 3371】【Kruskal、变了形的优先队列】

    题目链接 就是问你能否通过选取一些边构成一棵树 最小生成树 这道题的关键不在于此 在于学到了另外一种优先队列的写法 struct cmp bool operator Eddge e1 Eddge e2 return e1 val gt e2
  • 最小生成树之普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    作者 STzen 链接 https www jianshu com p 683ffde4f3a3 来源 简书 最小生成树 列子引入 如图假设v0到v8表示9个村庄 现在需要在这9个村庄假设通信网络 村庄之间的数字代表村庄之间的直线距离 求用
  • POJ1785

    prim算法求最小生成树 1 输入 一个加权连通图 其中顶点集合为V 边集合为E 2 初始化 V new x 其中x为集合V中的任一节点 起始点 E new 为空 3 重复下列操作 直到V new V a 在集合E中选取权值最小的边
  • tree【WQS二分+MST】

    题目链接 洛谷 精确涉及到了WQS二分 BZOJ 2654 不推荐 个人不推荐做BZOJ2654的这道题 因为那道题可以水过去 不用WQS二分也是可以的 可以直接二分答案 显然是没有这个好的 先在这里讲一下什么是WQS二分吧 也是从网上看来
  • prim算法解决最小生成树问题

    刚好这次又遇到了prim算法 就做了下整理 可以参考 数据结构与算法分析c 描述 这本书 个人而言 很经典 并把以前写的代码也整理了一下 做下分享 同时也加深下自己的理解 prim算法是解决最小生成树问题的一个很好的算法 此算法是是将点集合
  • Prim算法解决修路问题

    普里姆算法 Prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 意即由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 英语 Vertex graph theory 且其所有边的权值之和亦为最小 普里姆算法和Kru

随机推荐

  • macOS下使用anaconda相关系列

    创建虚拟环境 conda create n 环境名 python 61 3 6 进入虚拟环境 source bash profile source activate 环境名 其中bash profile是安装anaconda时候默认生成的环
  • Windows 安装NET4.6/4.7/4.8 时间戳签名和或证书无法验证或已损坏

    时间戳签名和或证书无法验证或已损坏 问题版本 xff1a 事件 xff1a 解决办法下载补丁程序 xff1a 安装KB2813430补丁 注意事项补丁需要重启设备生效 2021 10 11 by 崔斐然 问题 版本 xff1a win7专业
  • 在 Ubuntu Linux 中使用 PPA(完全指南)

    译 xff1a 在 Ubuntu Linux 中使用 PPA xff08 完全指南 xff09 作者 xff1a Abhishek Prakash 自由和开放源码软件的创造者 一个热心的 Linux 用户和开源推动者 从阿加莎 克里斯蒂和夏
  • RDP(远程桌面)优化

    RDP连接优化 一 优化连接时间二 优化集显帧率三 开启RemoteFX USB重定向 xff08 如果有需要 xff09 四 MacOS系统RDP超高清显示 2022 03 31 by 崔斐然 一 优化连接时间 1 客户端 xff1a 关
  • 【FRP】windowsServer部署FRP

    FRP windowsServer部署FRP 1 下载FRP nssm2 服务器端部署过程 xff1a 3 客户端部署过程 xff1a 4 卸载服务 2022 08 24 by 崔斐然 1 下载FRP nssm 下载地址 xff1a FRP
  • 【FRP】群晖docker中部署Frp

    2022 08 24 by 崔斐然 0 xff1a 需求 公司有台笔记本 xff0c 现在疫情期间居家办公 我用的MacBook RDP客户端做的非常好用 xff0c 如相互粘贴文件 文字等 xff0c MacBook通过远程桌面连接公司内
  • Debian 9/10快速开启Google BBR的方法,实现TCP高效单边加速

    BBR 是谷歌公司的某个员工研发出来的服务器单边加速算法 xff0c Linux内核从4 9版开始集成BBR算法 相比锐速BBR的加速效果更为温和 xff0c 并且占用内存小对服务器压力也很小 xff0c 当时理想情况下是可以跑满整个服务器
  • 基于机器学习的捡球机器人设计与实现(探索)第4篇——机械设计)

    2019 03 18 by 崔斐然 原以为软件很复杂 机械好搞 结果发现 都难搞 一次次想出办法又一次次被自己否定 我tm想静静
  • 人脸识别之Hog特征+SVM分类器训练与使用

    原文来自 xff1a https juejin im post 5b0e70686fb9a00a1451c8e7 计算机视觉 人脸识别 xff08 Hog特征 43 SVM分类器 xff09 一 SVM支持向量机 1 SVM原理 在机器学习
  • python利用PIL实现对图片截图

    在对图像处理时 xff0c 我们有时候需要对图片某区域进行截图 xff0c 话不多说 xff0c 直接上代码 xff1a from PIL import Image import sys 先将 input image 填充为正方形 def
  • PowerMock介绍和用法

    PowerMock PowerMock简介一 PowerMock xff1f 二 Mock底层原理1 Mockito2 PowerMock原理 三 应用场景1 依赖问题 xff0c 打桩 2 工程质量 PowerMock使用步骤一 添加依赖
  • Windows10 WSL2磁盘迁移

    一 使用 WSL 命令行工具 在 Windows 10 版本 1903 xff08 2019 年 4 月更新 xff09 或更高版本中 xff0c 您可以使用wsl exe命令行工具 1 导出分布 使用要移动的分发创建一个 tar文件wsl
  • linux下搭建confluence

    一 Java环境 java环境 二 mysql 2 1 安装前的检查和准备工作 2 1 1检查 1 是否安装过mysql xff1a rpm qa grep mysql 2 如果有的话 xff0c 就删除 xff08 XXXX是自己的mys
  • 译:SOME/IP 技术细节

    译 xff1a SOME IP 技术细节 原文 SOME IP technical details SOME IP Scalable service Oriented MiddlewarE over IP 基于 IP 可扩展面向服务中间件
  • Python requests_toolbelt的使用

    multipart form data Encoder The main attraction is a streaming multipart form data object MultipartEncoder Its API looks
  • ArchLinux中文安装教程

    以自己的电脑安装为参考 xff0c 已安装win10系统 最后效果为win10和arch双系统 xff01 xff01 xff01 一 准备工作 1 按照实际需要划分出一部分空闲磁盘空间 xff0c 右击想要安装arch的分区点击删除卷 x
  • C++20 范围库:关键优势——算法的组合

    从概念上讲 xff0c 范围 xff08 Range xff09 是一个简单的概念 xff1a 它只是一对迭代器 指向序列的开始和结束 xff08 在某些情况下是一个哨兵 xff09 然而 xff0c 这样的抽象却可以从根本上改变编写算法的
  • Drupal菜鸟笔记之使用Focal Point 模块实现图片压缩与裁剪

    在项目开发中总是有地方需要上传图片 xff0c 因此也常常需要对图片进行压缩与裁剪来达到我们想要的效果 最近项目中刚好要用到 xff0c 我就去搜索了 解了下图片的压缩与裁剪模块 xff0c 最后选择了 Focal Point Focal
  • Linux系统学习——ubuntu16.04开机蓝屏问题

    1 蓝屏原因 由于频繁地强制关机等原因造成 xserver xorg包出现损坏 xff0c 故在开机时屏幕显示出现问题 1 1 顺便提一下 xorg xorg 我们知道 xff0c Linux内核本身是没有图形化界面的 xff0c 其本身是
  • 最小生成树 Kruskal算法 Prim算法 洛谷P3366

    最小生成树 Kruskal算法 Prim算法 洛谷P3366 相较于Prim算法 xff0c 我觉得Kruskal算法更优 xff08 因为一般情况 xff0c 题目给你的边数都是正常的 xff0c Kruskal算法的时间复杂度为O El