首页 > 其他分享 >MST Kruskal 克鲁斯卡尔

MST Kruskal 克鲁斯卡尔

时间:2024-10-15 19:22:22浏览次数:6  
标签:MST cout int Kruskal 查集 克鲁斯 edge 节点

Kruskal算法实现最小生成树

复杂度 O(mlogm)

Kruskal算法是一种贪心算法,用于在加权无向图中找到最小生成树。以下是使用C++实现Kruskal算法的代码,包括详细的注释说明。

#include <bits/stdc++.h>  // 包含所有标准库头文件
using namespace std;      // 使用标准命名空间

typedef long long ll;      // 定义长整型别名
const int N = 1e4 + 10;   // 定义节点的最大数量

int fa[N];                // 并查集数组,存储每个节点的父节点
const int inf = 1e9;      // 定义无穷大常量,用于初始化边的权重

// 并查集的查找函数,用于找到元素x的根节点
int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}

// 边的结构体,包含两个节点和边的权重
struct Edge {
    int a, b, c;
};

// 比较函数,用于排序边,按照权重从小到大
bool cmp(Edge e1, Edge e2) {
    return e1.c < e2.c;
}

int main() {
    ios::sync_with_stdio(0);  // 关闭cin和cout的同步
    cin.tie(0);               // 解除cin和cout的绑定
    cout.tie(0);              // 解除cout和cout的绑定

    int n, m;                 // 分别存储节点数和边数
    cin >> n >> m;            // 读取节点数和边数

    // 读取每条边的信息,并存储到edge数组中
    for (int i = 1; i <= m; i++) {
        cin >> edge[i].a >> edge[i].b >> edge[i].c;
    }

    // 对边进行排序,使用cmp比较函数
    sort(edge + 1, edge + 1 + m, cmp);

    // 初始化并查集,每个节点的父节点都是自己
    for (int i = 1; i <= n; i++) {
        fa[i] = i;
    }

    // 初始化最小生成树的总权重和已加入的边数
    int ans = 0;
    int cnt = 0;

    // 遍历每条边,使用并查集判断是否形成环
    for (int i = 1; i <= m; i++) {
        int a = edge[i].a, b = edge[i].b, c = edge[i].c;
        int ta = find(a);  // 找到节点a的根节点
        int tb = find(b);  // 找到节点b的根节点

        // 如果节点a和b不属于同一个集合,则将它们合并,并更新最小生成树的总权重
        if (ta != tb) {
            cnt++;
            ans += c;
            fa[ta] = tb;  // 将节点a的根节点设置为节点b的根节点
        }

        // 如果已经找到了n-1条边,则说明已经形成了最小生成树
        if (cnt == n - 1) {
            break;
        }
    }

    // 如果未找到n-1条边,则说明图不连通
    if (cnt != n - 1) {
        cout << "orz" << endl;  // 输出"orz"
    } else {
        cout << ans << endl;    // 输出最小生成树的总权重
    }

    return 0;
}

代码说明

  1. 头文件和命名空间:使用<bits/stdc++.h>包含所有标准库头文件,使用using namespace std;声明使用标准命名空间。
  2. 数据类型定义:定义了长整型别名ll和节点的最大数量N
  3. 并查集:使用数组fa实现并查集,find函数用于查找元素的根节点。
  4. 边的结构体:定义了边的结构体Edge,包含两个节点和边的权重。
  5. 比较函数:定义了比较函数cmp,用于排序边。
  6. 主函数:读取节点数和边数,读取每条边的信息,对边进行排序,初始化并查集,遍历每条边,使用并查集判断是否形成环,计算最小生成树的总权重,输出结果。

这个代码实现了Kruskal算法,用于在加权无向图中找到最小生成树,并输出最小生成树的总权重。如果图不连通,则输出"orz"。

标签:MST,cout,int,Kruskal,查集,克鲁斯,edge,节点
From: https://www.cnblogs.com/ybjnb/p/18468226

相关文章

  • 图论 MST(最小生成树) prim
    #include<bits/stdc++.h>usingnamespacestd;constintP=1e6+7;constintinf=1e9;typedeflonglongll;intmp[1010][1010];intn,m;intd[1010];//从已选点到i的min权值intvis[1010];//选或没选voidprim(){ for(inti=1;i<=n;i++) d[i]=inf......
  • 一文带你了解生成树协议三个版本:STP、RSTP 和 MSTP
    生成树协议(SpanningTreeProtocol,STP)及其后续改进版,如快速生成树协议(RapidSpanningTreeProtocol,RSTP)和多生成树协议(MultipleSpanningTreeProtocol,MSTP),是保证网络冗余与稳定的关键技术。这些协议能够防止环路的出现,从而避免广播风暴和通信中断。本文将详细介绍STP、R......
  • 静态库封装之ComStr类
    ComStr.h#pragmaonce#include<string>#include<vector>usingnamespacestd;classComStr{public: //CString //============================================================================================================= /* func:CS......
  • Camstar 电子套件基础数据导入导出Export/Import
    前提准备:你的共享目录CamstarUploads弄好了,参考https://www.cnblogs.com/CarryYou-lky/p/16133849.html     ......
  • Camstar 在新db上快速搭建电子套件的内容
    1、前提:数据库创建、登录用户创建,参考https://www.cnblogs.com/CarryYou-lky/p/184541512、此时是一个空数据库,CamstarAP上的配置准备好:配置managementstudio完成,不用DataBase的Cretate和update,就配置好数据库连接就行  3、打开电子套件的安装包: 4、目录随意。注意:弹出......
  • Camstar Create Transaction Database
    sqlserverUSE[master]GO--CreatedatabaseCREATEDATABASEINSITEONPRIMARY(NAME='INSITE',FILENAME='C:\ProgramFiles\MicrosoftSQLServer\MSSQL13.MSSQLSERVER\MSSQL\DATA\INSITE.mdf',SIZE=100MB,FileGrowth=10%)LOGON(......
  • 题解:SP15553 STC00 - Hamsters
    首先,通过预处理计算每个名字的哈希值,然后利用哈希检查名字之间的最长公共前缀,从而确定从一个名字转移到另一个名字的最小代价。使用倍增动态规划计算转移的最小成本,\(f_{t,i,j}\)表示从名字\(i\)经过\(2^t\)步转移到名字\(j\)的最小代价,最后通过位运算处理\(M\)次转移的......
  • Pyramid Interests PerfectNumber ArmstrongNumbers
    Homework2Note:Submityourwork(uploadthe.javasourcecodefilesONLY,notthecompiled.classfiles!)throughthe“Homework2”linkonBrightspace.Youmaysubmitanunlimitednumberoftimes;wewillonlygradethelast/latestsubmissionattempt,but......
  • 828华为云征文|部署音乐流媒体服务器 mStream
    828华为云征文|部署音乐流媒体服务器mStream一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1重置密码2.2服务器连接2.3安全组配置2.4Docker环境搭建三、Flexus云服务器X实例部署mStream3.1mStream介绍3.2mStream部署3.3mStream使用四、总结......
  • 题解:CF888G Xor-MST
    题解:CF888GXor-MST题目大意:给定\(n\)个点的点权,任意两点间边权是点权的异或和。求这张完全图的MST的权值。思路:Boruvka+Trie树+按位贪心。关键就在于如何求出Boruvka中的best数组。考虑对点权建trie树,对于节点\(i\)本轮的连边,就是找“和它最相似”的那......