普里姆 & 克鲁斯卡尔算法

本文介绍了连通图和最小生成树的概念,并详细阐述了如何使用普里姆和克鲁斯卡尔算法求解最小生成树。通过这两种算法,可以找到保证图连通且总权值最小的边集。文章提供了算法的实现步骤及实际应用效果。
摘要由CSDN通过智能技术生成

一.简介

连通图:任意2节点之间都有路径相通

最小生成树:最小权重生成树
一个 n 结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边(n-1)。 最小生成树可以用prim(普里姆)算法或kruskal(克鲁斯卡尔)算法求出。

二.实现

在这里插入图片描述

该图的最小生成树权值和为:19

在这里插入图片描述

1.普里姆算法

设T为最小生成树集合,V为节点集合,U为还未放入T集合的节点集合(U=V-T)

1.先选取任意节点放入T

2.获取T 与 U 集合中最小权值节点v’,并加入T集合

3.循环2直到集合T中有n-1条边

2.克鲁斯卡尔算法

按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路(不让新选择边的2节点再次被选择)。


package com.vincent;


import java.util.*;

public class Main {
   
    //定义边
    static  class Edge{
   
        int vertex1;
        int vertex2;
        int weight;

        @Override
        public boolean equals(Object o) {
   
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Edge edge = (Edge) o;
            return vertex1 == edge.vertex1 &&
                    vertex2 == edge.vertex2;
        }

        @Override
        public int hashCode() {
   
            return Objects.hash(vertex1, vertex2);
        }

        @Override
        public String toString() {
   
            return String.format("(%d,%d,%d)",vertex1,vertex2,weight);
        }
    }

    public static void main(String[] args) throws Exception {
   
        char[] datas = {
   'a','b','c','d','e'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值