最小生成树问题与Prim、Kruskal算法

贪心算法在最小生成树问题中的应用:Prim和Kruskal算法对比 本文旨在深入浅出地讲解贪心算法在最小生成树问题中的应用,重点比较Prim和Kruskal两种算法的原理、实现和性能差异。我们将覆盖从基础概念到实际代码实现的完整知识链。文章首先介绍最小生成树和贪心算法的基本概念,然后分别深入讲解Prim和Kruskal算法,包括原理、实现和比较,最后给出实际应用建议和扩展思考。最小生成树(MST): 在一个连通无向图中,连接所有顶点的边构成的树,且所有边的权重之和最小。贪心算法: 在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法。连通图。 阅读详情

一.带权图基础

1.什么是带权图

带权图指的是顶点之间的不仅有连接关系,并且连接关系上带有权重。
在这里插入图片描述

2.如何实现

对于带权图来说,由于比无权图多了一项权重,所以需要多使用一个数据结构来描述“边的权重”,所以需要多出一个Edge类。

3.Java代码实现

依然使用邻接表来表示带权图:

  • WeightGraph
/**
 * @Auther: ARong
 * @Date: 2020/3/4 5:37 下午
 * @Description: 带权图的邻接表实现
 */
public class WeightGraph {
    /*
    * 边数据结构
     */
    private static class Edge {
        private int a; // 第一个顶点编号
        private int b; // 第二个顶点编号
        private int weight; // 权重

        public Edge(int a, int b, int weight) {
            this.a = a;
            this.b = b;
            this.weight = weight;
        }

        public Edge(Edge edge) {
            this.a = edge.a;
            this.b = edge.b;
            this.weight = edge.weight;
        }

        public int getV() {
            return a;
        }

        public int getW() {
            return b;
        }

        public int getWeight() {
            return weight;
        }

        public int getOther(int x) {
            assert x == a || x == b;
            return x == a ? b : a;
        }

        @Override
        public String toString() {
            return String.format("%d-%d: %d", a, b, weight);
        }

    }


    // 顶点数
    private int vertexNum;
    // 边数
    private int edgeNum;
    // 带权图,每个顶点都含有一个含有边的链表
    private List<Edge>[] graph;
    // 是否为有向图
    private boolean directed;

    public WeightGraph(int vertexNum, boolean directed) {
        this.vertexNum = vertexNum;
        this.directed = directed;
        // 初始化邻接表
        graph = (LinkedList<Edge>[]) new LinkedList[vertexNum];
        for (int i = 0; i < vertexNum; i++) {
            graph[i] = new LinkedList<Edge>();
        }
    }

    public int getVertexNum() {
        return vertexNum;
    }

    public int getEdgeNum() {
        return edgeNum;
    }
    
    public List<Edge>[] getGraph() {
        return graph;
    }
    
    /*
     * @Author ARong
     * @Description 在图中添加一条边
     * @Date 2020/3/4 5:58 下午
     * @Param [w, v, weight]
     * @return void
     **/
    public void addEdge(int w, int v, int weight) {
        assert w >= 0 && w < vertexNum && v >= 0 && v < vertexNum;
        // 获取w的边链表,添加w->v的关系
        List<Edge> edges1 = graph[w];
        Edge newEdge1 = new Edge(w, v, weight);
        edges1.add(newEdge1);
        if (!directed) {
            // 无向图,在增加另一边的关系
            // 获取v的边链表,添加v->w的关系
            List<Edge> edges2 = graph[v];
            Edge newEdge2 = new Edge(v, w, weight);
            edges2.add(newEdge2);
        }

        // 边数增加
        edgeNum++;
    }
    public void print() {
        System.out.println(String.format("顶点数:%d, 边数:%d", vertexNum, edgeNum));
        for (int i = 0; i < graph.length; i++) {
            // 取出每个边链表进行遍历
            List<Edge> edges = graph[i];
            Iterator<Edge> iterator = edges.iterator();
            StringBuilder str = new StringBuilder(i + "-\t");
            while (iterator.hasNext()) {
                Edge edge = iterator.next();
                System.out.println(String.format("%d - %d : %d", edge.a, edge.b, edge.weight));
            }
        }
    }


    public static void main(String[] args) {
        WeightGraph graph = new WeightGraph(4, false);
        graph.addEdge(0, 1, 8);
        graph.addEdge(0, 2, 9);
        graph.addEdge(0, 3, 5);
        graph.addEdge(1, 2, 7);
        graph.addEdge(2, 3, 6);

        graph.print();

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXm2EwqA-1583500038524)(http://note.youdao.com/yws/res/14173/C42812DC7BD544BD827ECB23C745952E)]

顶点数:4, 边数:5
0 - 1 : 8
0 - 2 : 9
0 - 3 : 5
1 - 0 : 8
1 - 2 : 7
2 - 0 : 9
2 - 1 : 7
2 - 3 : 6
3 - 0 : 5
3 - 2 : 6

二.最小生成树与切分定理

1.最小生成树(Min Span Tree,MST)

最小生成树其实是最小权重生成树的简称。

一个含有v个顶点的连通图,可以使用v - 1条边将其全部连接起来,而当这v - 1条边的权重累加值最小时,该v个顶点与v - 1条边组成的树被称为最小生成树。

在这里插入图片描述
最小生成树在布线方面有十分重要的应用,如果将图中的顶点视为城市,那么如何布置电话线路使得所有城市可以被连通起来,且线路费用最小就是一个经典的最小生成树问题。

2.切分定理
  • 定义一:把图中的结点分为两部分,称为一个切分(Cut)
  • 定义二:如果一个边的两个端点,属于切分不同的两边,这个边称为横切边(Crossing Edge)
  • 切分定理:给定任意切分,横切边中权值最小的边必然属于最小生成树

    在这里插入图片描述

三.Prim算法

Prim即普里姆算法,是一种简单求解最小生成树的算法,此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。

算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

1.Lazy Prim算法
1.算法思路

Prim算法的懒惰实现过程是:

  1. 从第0个顶点开始,将访问到的顶点记录起来
  2. 获取到顶点的所有邻边(注意该边的另一端的顶点必须没有被访问过,不然该边不属于横切边),并且将边的权值加入到最小堆中
  3. 从最小堆中取出当前最小边,根据切分定理,这条边肯定为MST的一条边
  4. 将当前顶点设置为该最小边的另一头顶点,开始重复1、2、3过程
  5. 当最小堆为空时,MST构造完成
    在这里插入图片描述
2.代码实现
/**
 * @Auther: ARong
 * @Date: 2020/3/6 4:17 下午
 * @Description: 最小生成树问题-Lazy Prim算法
 */
public class LazyPrimMST {
    private WeightGraph graph;// 图的引用
    private PriorityQueue<WeightGraph.Edge> minHeap;// 最小堆
    private boolean[] marked; // 标记数组,在算法运行过程中标记结点 i 是否被访问
    private List<WeightGraph.Edge> mst; // 最小生成树所包含的所有边
    private Integer mstWeight;//最小生成树的权值

    /*
     * @Author ARong
     * @Description 实现Lazy Prim算法
     * @Date 2020/3/6 4:38 下午
     * @Param [graph]
     * @return
     **/
    public LazyPrimMST(WeightGraph graph) {
        this.graph = graph;
        // 构造Edge的最小堆
        minHeap = new PriorityQueue<>((e1 ,e2)->{
            return e1.getWeight() - e2.getWeight();
        });
        marked = new boolean[graph.getVertexNum()];
        mst = new ArrayList<>();

        // Lazy Prim
        // 1. 首先访问第0个顶点
        visit(0);
        // 2. minHeap不为空时进行MST的收集
        while (!minHeap.isEmpty()) {
            WeightGraph.Edge minEdge = minHeap.poll();
            // 这条边两端都被访问过,则抛弃
            if (marked[minEdge.getV()] && marked[minEdge.getW()]) {
                continue;
            }
            mst.add(minEdge);
            // 继续在未访问过的顶点进行访问
            if (!marked[minEdge.getV()]) {
                visit(minEdge.getV());
            } else {
                visit(minEdge.getW());
            }
        }
    }

    public List<WeightGraph.Edge> getMst() {
        return mst;
    }

    public int getWeight() {
        // 将mst中的权值累加返回
        int total = 0;
        for (WeightGraph.Edge edge : mst) {
            total += edge.getWeight();
        }
        return total;
    }

    /*
     * @Author ARong
     * @Description 访问第v个顶点,设置访问标示,并且将其尚未访问过的邻边加入到最小堆中(横切边)
     * @Date 2020/3/6 4:45 下午
     * @Param [index]
     * @return void
     **/
    private void visit(int v) {
        if (marked[v] || v >= graph.getVertexNum()) {
            return;
        }
        // 访问标示
        marked[v] = true;
        // 将v尚未访问过的邻边加入到最小堆中(横切边)
        for (WeightGraph.Edge edge : graph.getGraph()[v]) {
            // 改变的另一个节点一定不可被访问过,否则不是横切边
            if (!marked[edge.getOther(v)]) {
                minHeap.offer(edge);
            }
        }
    }


    public static void main(String[] args) {
        WeightGraph graph = new WeightGraph(4, false);
        graph.addEdge(0, 1, 8);
        graph.addEdge(0, 2, 9);
        graph.addEdge(0, 3, 5);
        graph.addEdge(1, 2, 7);
        graph.addEdge(2, 3, 6);

        graph.print();

        // 获取mst
        LazyPrimMST lazyPrimMST = new LazyPrimMST(graph);
        System.out.println(lazyPrimMST.getMst());
        System.out.println(lazyPrimMST.getWeight());
    }
}
顶点数:4, 边数:5
0 - 1 : 8
0 - 2 : 9
0 - 3 : 5
1 - 0 : 8
1 - 2 : 7
2 - 0 : 9
2 - 1 : 7
2 - 3 : 6
3 - 0 : 5
3 - 2 : 6
[0-3: 5, 3-2: 6, 2-1: 7]
18
3.时空复杂度

Lazy Prim算法懒惰的地方在于,minHeap中其实存储了很多不可能再构成横切边的边,但是在Lazy Prim算法中并不给予清除,而是使用了marked数组来判断其是否为横切边。

设图中有E个条边,V个节点,那么有:

  • 空间复杂度:O(E),堆中需要放置全部边
  • 时间复杂度:O(ElogE),每次visit为O(logE),一共进行了E次
2.Direct Prim算法

Prim算法的即时实现优化了最小堆的空间,一般是借助最小索引堆来实现。

具体的实现思路与Lazy Prim差不多,具体可以参考:

https://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html

四.Kruskal算法

Kruskal算法即克鲁斯卡尔算法,是相较于Prim算法的另一个被用于求最小生成树问题的算法,它采取的是贪心策略。首先将边通过升序排列起来,然后不断地挑选出最小的边,并判断取出该边作为最小生成树的边是否会产生环,若不会则该边就是最小生成树的一条边。Krsukal算法又被称为“加边法”。

1.算法思路
  1. 先将边存储进最小堆中
  2. 每次取出最小的边,通过并查集判断该边的两个顶点是否连通分量,不连通则不会成环,取出该边作为最小生成树的一条边
  3. 将该边的两个顶点连通起来
  4. 重复1,2,3过程,直到最小生成树的边数 = 顶点数 - 1
    在这里插入图片描述
2.代码实现
  • KruskalMST
/**
 * @Auther: ARong
 * @Date: 2020/3/6 7:00 下午
 * @Description: Kruskal算法求解最小生成树
 */
public class KruskalMST {
    private WeightGraph graph;// 图的引用
    private PriorityQueue<WeightGraph.Edge> minHeap;// 最小堆
    private List<WeightGraph.Edge> mst; // 最小生成树所包含的所有边
    private Integer mstWeight;//最小生成树的权值


    /*
     * @Author ARong
     * @Description kruskal算法实现最小生成树
     * @Date 2020/3/6 8:50 下午
     * @Param [graph]
     * @return
     **/
    public KruskalMST(WeightGraph graph) {
        this.graph = graph;
        // 构造Edge的最小堆
        minHeap = new PriorityQueue<>((e1 ,e2)->{
            return e1.getWeight() - e2.getWeight();
        });
        mst = new ArrayList<>();

        // Kruskal
        // 1. 将所有的边添加到最小堆中
        for (int i = 0; i < graph.getGraph().length; i++) {
            List<WeightGraph.Edge> edges = graph.getGraph()[i];
            for (WeightGraph.Edge edge : edges) {
                // 防止重复加入边
                if (edge.getV() < edge.getW()) {
                    minHeap.add(edge);
                }
            }
        }
        // 2. 创建并查集,保存顶点间的连通关系
        UnionFind unionFind = new UnionFind(graph.getVertexNum());
        // 3. 收集到mst的边数 = 顶点数 - 1时即完成最小生成树的边数收集
        while (!minHeap.isEmpty() && mst.size() < graph.getVertexNum() - 1) {
            WeightGraph.Edge minEdge = minHeap.poll();
            // 判断顶点是否连通成环,不成环则加入mst
            if (unionFind.find(minEdge.getV(), minEdge.getW())) {
                continue;
            }
            // 加入mst和并查集
            mst.add(minEdge);
            unionFind.union(minEdge.getV(), minEdge.getW());
        }
    }

    public List<WeightGraph.Edge> getMst() {
        return mst;
    }

    public int getWeight() {
        // 将mst中的权值累加返回
        int total = 0;
        for (WeightGraph.Edge edge : mst) {
            total += edge.getWeight();
        }
        return total;
    }

    public static void main(String[] args) {
        WeightGraph graph = new WeightGraph(4, false);
        graph.addEdge(0, 1, 8);
        graph.addEdge(0, 2, 9);
        graph.addEdge(0, 3, 5);
        graph.addEdge(1, 2, 7);
        graph.addEdge(2, 3, 6);

        graph.print();

        // 获取mst
        KruskalMST kruskalMST = new KruskalMST(graph);
        System.out.println(kruskalMST.getMst());
        System.out.println(kruskalMST.getWeight());
    }
}
  • UnionFind
/**
 * @Auther: ARong
 * @Date: 2020/3/6 7:05 下午
 * @Description: 并查集实现
 */
public class UnionFind {
    // 存储元素的父节点索引
    private int[] parent;


    public UnionFind(int capacity) {
        parent = new int[capacity];
        // 初始化parent数组,让各个元素的父节点指向自身,表面其自身已经是根节点
        for (int i = 0; i < parent.length; i++) {
            parent[i] = i;
        }
    }

    /*
     * @Author ARong
     * @Description 判断x与y是否连通
     * @Date 2020/3/6 7:08 下午
     * @Param [x, y]
     * @return boolean
     **/
    public boolean find(int x, int y) {
        // 根节点相同
        if (find(x) == find(y)) {
            return true;
        }
        return false;
    }

    /*
     * @Author ARong
     * @Description 查询x的根节点
     * @Date 2020/3/6 7:09 下午
     * @Param [x]
     * @return int
     **/
    private int find(int x) {
        if (x == parent[x]) {
            return x;
        }
//        while (x != parent[x]) {
//            x = parent[x];
//        }
        // 路径压缩,在寻找根节点的过程中不断地将节点的父节点往上挪,最后形成两层
        if (x != parent[x]) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }

    /*
     * @Author ARong
     * @Description 将x与y相连通
     * @Date 2020/3/6 7:13 下午
     * @Param [x, y]
     * @return void
     **/
    public void union(int x, int y) {
        if (find(x) == find(y)) {
            return;
        }
        parent[find(x)] = find(y);
    }
}
顶点数:4, 边数:5
0 - 1 : 8
0 - 2 : 9
0 - 3 : 5
1 - 0 : 8
1 - 2 : 7
2 - 0 : 9
2 - 1 : 7
2 - 3 : 6
3 - 0 : 5
3 - 2 : 6
[0-3: 5, 2-3: 6, 1-2: 7]
18
3.时空复杂度
  1. 空间复杂度:O(E),E为边数
  2. 时间复杂度:O(ElogE)
Kruskal算法和prim算法求最小生成树学习小结(JAVA) NULL 博文链接:https://128kj.iteye.com/blog/1705936 立即下载

相关推荐

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 440

最小生成树——Prim算法(详细图解)

最小生成树的概念 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边,而 w(u, v) 代表此的边权重,若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的最小生成树。最小生成树其实是最小权重生成树的简称。 ...

qq_62213124的博客 22万+

RC4加密算法详解

RC4(也称为 Rivest Cipher 4)是流密码的一种形式,流密码逐字节操作数据流。RC4 流密码是使用最广泛的流密码之一,它通过算法一次一个字节地加密消息,简单并且操作速度快。RC4是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权的用户才能享受该服务,使用 64 位或 128 位密钥大小。它通常用于安全套接层 (SSL)、传输层安全 (TLS) 等应用,也用于 IEEE 802.11 无线 LAN 标准。在存储大量的信息时,RC4展现出它的实用性,面对大量的数据,

weixin_43211186的博客 1万+

最小生成树

INTRODUCTION 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 --百度百科 概述 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若...

weixin_30243533的博客 366

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1533

CarSim转向控制对比指南:开环扭矩控制vs转角控制(附Simulink连接示例)

本文深入对比了CarSim中车轮转角控制与开环扭矩控制的核心原理与适用场景。开环扭矩控制能激活完整的转向系统动力学,更适用于EPS控制策略开发与驾驶员在环仿真等对真实性要求高的场景。文章提供了详细的Simulink接口配置步骤与连接示例,为车辆动力学仿真工程师提供了清晰的决策与实操指南。

weixin_29199873的博客 480

最小生成树:Prim算法、Kruskal算法和Boruvka算法

最小生成树:最小权重生成树的简称。在一给定的加权无向图G=(V,E)中,(u,v)代表连接顶点u和顶点v的便,而w(u,v)代表此边的权重。 若存在T中的顶点是所有V,T的边是E的子集中,且T中没有环,而w(T)最小,则此T为G的最小生成树。 Prim算法 普里姆算法(Prim’s algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。 ????算法原理 “加点法”, 每次迭代选择代价最小

加油,樊!的博客 2112

基于Simulink的H∞鲁棒控制器设计与仿真建模示例

本文介绍了基于Simulink的H∞鲁棒控制器设计与仿真方法。针对质量-弹簧-阻尼系统存在±50%刚度不确定性的问题,详细阐述了从构建广义被控对象、设计性能加权函数,到使用hinfsyn综合控制器的完整流程。通过Simulink仿真验证,所设计的H∞控制器在参数摄动和外部扰动下均保持良好性能,位移控制误差小于2%,扰动衰减超过20dB。相比传统PID控制,H∞方法展现出显著鲁棒性优势。文章还总结了工程实践中的加权函数调参技巧、控制器降阶方法,并展望了μ-综合等扩展方向,为处理系统不确定性提供了实用解决方案。

amy_mhd的博客 70

最小生成树算法详解(prim+kruskal)

最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。最小生成树其实是最小权重生成树的简称。 prim: 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的...

407

MATLAB地理数据处理 25:植被物候提取及分析模型优化(Savitzky-Golay)

之前我写过一篇使用Savitzky-Golay处理遥感数据,获取地面物候信息的MATLAB代码,但是发现存在一些问题:对物候开始期和物候结束期的阈值设定都为相同值,但是有些研究中,需要根据不同的环境条件,设置不同的物候阈值,所以对其进行相应的修改。

amyniez的博客,欢迎交流讨论 2233

【人工智能】大模型可以分为L0层:基础大模型/通用大模型、L1层:行业大模型、L2层:细分场景模型三个层级

大模型确实可以分为L0、L1、L2三个层级,这种分层架构不仅有助于提升模型的泛化能力和适应性,还能更好地满足不同行业和场景的需求。华为盘古大模型的分层架构(L0、L1、L2)在多个证据中得到了详细描述和验证。例如,华为云盘古大模型3.0明确分为L0基础大模型、L1行业大模型和L2场景模型三层架构。此外,其他来源也一致支持这一分层架构,如用友网络的企业服务大模型、智谱AI的GLM-4系列等。

奶爸的编程之路,也就一周冷个三天 3986

最小生成树(Minimum Spanning Tree, MST)

以下是Prim算法在C++中的实现。这个实现使用了优先队列(堆)来选择权重最小的边,并逐步构建最小生成树。中,使得所有节点连通且总权重最小的一棵树。设置图的顶点和边,调用 Kruskal 算法并输出最小生成树。实现Prim算法,使用优先队列(最小堆)来选择最小权重的边。并查集实现,用于管理顶点集合,并支持路径压缩和按秩合并。以下是Kruskal算法在C++中的实现。:设置图的顶点和边,调用Prim算法并输出最小生成树。这个实现适用于任意无向加权图,并高效地找到最小生成树。Kruskal算法的实现。

1927

基于Playwright与异步技术的公司评价智能爬取实战:以Glassdoor为例

本文将介绍一套基于最新Python技术的智能爬虫解决方案,使用Playwright实现浏览器自动化,结合异步编程和智能解析技术,高效抓取Glassdoor等平台的公司评价数据。我们不仅关注数据获取,更注重数据的结构化处理和反反爬虫策略的实现。

2201_76125261的博客 223

图解最小生成树问题:Kruskal算法和Prim算法

本文全面介绍了两类经典算法,用于解决无向图中的最小生成树(MST)问题。文章解释了最小生成树的概念,并详细对比分析了Kruskal和Prim两种算法的原理、特点及应用场景。文章重点以图文并茂的方式,通过示例演示了算法的执行过程,包括详细的步骤解析和权值图示。Kruskal算法侧重边的逐步加入,适用于稀疏图;Prim算法侧重点的逐步扩张,适用于稠密图。两者均采用贪心策略,在网络设计、电路布线等领域有着广泛的应用。

m0_74496615的博客 2698

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【算法笔记】Kruskal/Prim算法——求解最小生成树问题

最小生成树问题:给定一张带权无向图G,求它的一棵生成树,使其中所有边权之和最小。本文将介绍针对这种问题的两种经典算法——Kruskal和Prim。

天生我材必有用,千金散尽还复来。 4946

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

kruskal算法_最小生成树问题(Prim算法、Kruskal算法)

最小生成树问题是指给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。无向连通子图指对一个无向图G=(V, E)中的两点x和y,若存在交替的顶点和边的序列(在有向图中要求有向边属于E),则两点 x和y是...

weixin_39540725的博客 308

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最小生成树问题用Prim算法或Kruskal算法

chy89224的博客 859

用prim和kruskal算法求最小生成树问题

用prim和kruskal算法求最小生成树问题

m0_64378422的博客 723

prim求最小生成树_最小生成树问题(Prim算法、Kruskal算法)

最小生成树问题是指给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。无向连通子图指对一个无向图G=(V, E)中的两点x和y,若存在交替的顶点和边的序列(在有向图中要求有向边属于E),则两点 x和y是...

weixin_31530761的博客 658

最小生成树问题——Prim算法和Kruskal算法

最小生成树经典算法Matlab实现

qq_45494484的博客 983

最小生成树问题:Prim(普里姆)算法、Kruskal(克鲁斯卡尔)算法

(2)在已有的生成树节点集合中,选择一个边,且这条边的另一端是未加入树中的节点,且边的权重最小。一个连通的无向加权图 G=(V,E),其中 V 是顶点集合,E 是边集合,每条边都有一个权值(通常为正数,表示距离、成本或权重),寻找 G 中的一棵生成树,使得所有顶点连通且总权值最小。最终生成的最小生成树的边为:(v1,v3)、(v3,v4)、(v4,v6)、(v3,v2)、(v2,v5)最终生成的最小生成树的边为:(v1,v3)、(v3,v4)、(v4,v6)、(v3,v2)、(v2,v5)

qq_57707525的博客 1409

经典算法 - 图解图的最小生成树问题与prim、kruskal算法

图的最小生成树 前面介绍了图:数据结构 - 图与深度优先、广度优先遍历 生成树:无向图G的生成子图是连通且不含回路的无向图,称为G的生成树 现有一个图:有7个顶点{'A','B','C','D','E','F','G'},顶点间长度为权值 现要保证所有顶点连通且长度最短 这个问题就是求最小生成树,有两种经典的算法:prim、kruskal算法 普利姆算法(prim) prim算法的核心思想: 从起点开始,每次都找到该起点的权值最小的边 将该边的另一个顶点加入集合visited,然后找visited集

key_768的博客 1407

【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法

两种经典贪心算法解决最小生成树问题。

记录学习痕迹的公众号:Piper蛋窝 887

59、【图+树】最小生成树(BST)问题——Prim算法和Kruskal算法(C/C++版)

一、介绍 最小生成树是 设图中节点数为n,边数为m。 当存储的图为稠密图时,常用朴素Prim算法O(n2);当存储的图为稀疏图时,常用Kruskal算法O(m log2m)。

STAR GAME 2513

最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)

  2015-12-17晚,复习,甚是无聊,阅《复杂网络算法与应用》一书,得知最小生成树问题(Minimum spanning tree)问题。记之。   何为树:连通且不含圈的图称为树。   图T=(V,E),|V|=n,|E|=m,下列关于树的说法等价: T是一个树。 T无圈,且m=n-1。 T连通,且m=n-1。 T无圈,但每加一新边记得到唯一一个圈。 T连通,但...

diancha6978的博客 3696

最小生成树问题(Prim算法和Kruskal算法)

模板题,只不过这次在做的时候感觉又学到了些新的东西,之前都是数据结构里学的,因为用惯了C++,所以就想摆脱那些邻接数组之类的写法,用STL试一下,在其中把我遇到的一些问题写出来分享给大家

Lee贤的博客 680
上一篇: 图论基础入门
下一篇: 分布式基础-大型网站架构演进过程
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值