搜索与图论——Kruskal算法求最小生成树

kruskal算法相比prim算法思路简单,不用处理边界问题,不用堆优化,所以一般稀疏图都用Kruskal。

Kruskal算法时间复杂度O(mlogm)

每条边存结构体里,排序需要在结构体里重载小于号

判断a,b点是否连通以及将点假如集合中需要并查集的知识

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 100010, M = 200010;

int n, m;
int p[N];

struct Edge
{
    int a, b, w;
    bool operator< (const Edge& W)const
    {
        return w < W.w;
    }
}edges[M];

int find(int x)
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int Kruskal()
{
    int res = 0,cnt = 0;
    for(int i = 1; i <= n; i ++ )
    {
        p[i] = i;
    }
    for(int i = 0; i < m; i ++ )
    {
        int a = find(edges[i].a), b = find(edges[i].b);
        if(a != b)
        {
            p[a] = b;
            res += edges[i].w;
            cnt ++ ;
        }
    }
    if(cnt < n - 1) return 0;
    else return res;
}

int main()
{
    cin >> n >> m;
    for(int i = 0; i < m; i ++ )
    {
        int a, b, w;
        cin >> a >> b >> w;
        edges[i].a = a, edges[i].b = b, edges[i].w = w;
    }
    sort(edges, edges + m);
    int t = Kruskal();
    if(!t) cout << "impossible" << endl;
    else cout << t << endl;
    return 0;
}
相关推荐
代码游侠10 分钟前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_7634724620 分钟前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy1 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异1 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653231 小时前
分布式系统安全通信
开发语言·c++·算法
天天爱吃肉82182 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
alphaTao2 小时前
LeetCode 每日一题 2026/2/2-2026/2/8
算法·leetcode
甄心爱学习2 小时前
【leetcode】判断平衡二叉树
python·算法·leetcode
颜酱3 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
不知名XL3 小时前
day50 单调栈
数据结构·算法·leetcode