数据结构-prim算法

一 思路

prim算法核心就是三步,我称为prim三部曲,大家一定要熟悉这三步,代码相对会好些很多:

  1. 第一步,选距离生成树最近节点
  2. 第二步,最近节点加入生成树
  3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)

二 minDist 数组是什么

minDist数组 用来记录 每一个节点距离最小生成树的最近距离

三 模板

53. 寻宝(第七期模拟笔试)

java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建一个Scanner对象来读取用户输入
        Scanner input = new Scanner(System.in);
        
        // 读取顶点数和边数
        int v = input.nextInt(); // 顶点的数量
        int e = input.nextInt(); // 边的数量

        // 初始化邻接矩阵,所有距离初始化为10001(这里假设10001是一个足够大的数,表示无穷大)
        int[][] map = new int[v + 1][v + 1];
        for (int i = 0; i <= v; i++) {
            Arrays.fill(map[i], 10001);
        }
        
        // 读取边的信息,并更新邻接矩阵
        for (int i = 0; i < e; i++) {
            int v1 = input.nextInt(); // 边的起点
            int v2 = input.nextInt(); // 边的终点
            int val = input.nextInt(); // 边的权重

            map[v1][v2] = val; // 更新邻接矩阵,表示v1到v2的距离为val
            map[v2][v1] = val; // 因为是无向图,所以v2到v1的距离也是val
        }

        // 初始化一个布尔数组,用于标记顶点是否已经被加入到最小生成树中
        boolean[] isInTree = new boolean[v + 1];
        Arrays.fill(isInTree, false);

        // 初始化一个数组,用于存储每个顶点到最小生成树的最小距离
        int[] minDis = new int[v + 1];
        Arrays.fill(minDis, 10001);

        // Prim算法的主循环
        for (int i = 1; i < v; i++) {
            int minVal = Integer.MAX_VALUE; // 初始化最小值为无穷大
            int point = -1; // 用于存储当前最小距离的顶点

            // 寻找当前未加入最小生成树的顶点中,距离最小的顶点
            for (int j = 1; j <= v; j++) {
                if (!isInTree[j] && minDis[j] < minVal) {
                    minVal = minDis[j];
                    point = j;
                }
            }

            // 将找到的顶点加入到最小生成树中
            isInTree[point] = true;

            // 更新与point相连的顶点的最小距离
            for (int k = 0; k <= v; k++) {
                if (!isInTree[k] && minDis[k] > map[point][k]) {
                    minDis[k] = map[point][k];
                }
            }
        }

        // 计算最小生成树的总权重
        int ret = 0;
        for (int i = 2; i <= v; i++) {
            ret += minDis[i];
        }

        // 输出最小生成树的总权重
        System.out.println(ret);
    }
}
相关推荐
梁辰兴43 分钟前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_7982 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm3 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡3 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年5 小时前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs6665 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径
今日无bug5 小时前
JS 数据类型 + 内存分配:从 8 种类型到栈堆模型
javascript·数据结构
wabs6665 小时前
关于哈希表【力扣454.四数相加II的思考】
数据结构·算法·leetcode·散列表
白狐_7986 小时前
408数据结构第7章:查找①——顺序查找、折半查找、分块查找知识总结
数据结构
ShineWinsu6 小时前
对于C++中unordered_map的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_map