prim算法

刚学习prim算法,看了好久,最后还是抄了一遍理解清楚了,现在梳理一下框架

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

第一步输入数据,没有路径的地方需要设置成一个大数,类似此路不通的意思。用一个grid二维数组记录下来。

第二步记录每个节点到已生成最小生成树的距离,用一个midDir一维数据记录,初始值每个节点都不连通,设为一个大数;然后用一个isAddTree来记录是否已经加入最小生成树。

然后开始prim三部曲,循环遍历v次,因为要加入v个节点(此时的i无任何意义,只代表循环次数):

定义min:记录节点到最小生成树的最小距离.初始设为MAX_VALUE,因为第一个节点要加入

定义当前节点curnode:初始值设为-1

循环每个节点:

1、if(当前节点没有加入生成树&&比已经记录其他节点到生成树的距离都要小):

curnode等于它;

min等于它到最小生成树的距离;

2、遍历完后,找到了最小结点,把它加入到最小生成树,isAddTree = true

3、更新当前结点到最小生成树的距离

遍历每个结点:

if(结点没加入最小生成树&&grid[curnode][j] < midDir):

minDir[j] = grid[curnode][j];

遍历minDir求和得到结果

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

public class prim{
    public static void main (String[] args) {
        /* code */
        Scanner sc = new Scanner(System.in);
        int v = sc.nextInt();
        int e = sc.nextInt();
        //c从1号节点开始,更符合习惯
        int[][] grid = new int[v+1][v+1];
        for(int i = 0; i<= v; i++){
            Arrays.fill(grid[i],10001);
        }
        for(int i = 0; i < e; i++){
            int s = sc.nextInt();
            int t = sc.nextInt();
            int q = sc.nextInt();
            grid[s][t] = q;
            grid[t][s] = q;
        }

        //存储每个节点到最小生成树的距离
        int[] minDir = new int[v+1];
        Arrays.fill(minDir,10001);

        //记录哪些节点已经加入生成树
        boolean[] isAddTree= new boolean[v+1];

        for(int i = 1; i <= v; i++){
            //1.选择距离生成树最近的节点
            int min = Integer.MAX_VALUE;
            int curNode = -1;
            for(int j = 1; j <= v; j++){
                //如果j结点没有加入并且距离最小,记录当前距离,看看是不是最近的,是最近的就加入
                if(!isAddTree[j] && minDir[j] < min){
                    curNode = j;
                    min = minDir[j];

                }
            }

            //2.将最近的节点加入到最小生成树
            isAddTree[curNode] = true;

            //3.更新节点到最小生成树的距离,因为最小生成树已经更新了(实际只需要更新和curNode的最小距离)
            for(int j = 1; j<=v; j++){
                if(!isAddTree[j] && grid[curNode][j] < minDir[j]){
                    minDir[j] = grid[curNode][j];
                    //System.out.println(minDir[j]);
                }
            }
        }

        //统计结果
        int res = 0;
        for(int i = 2; i <=v; i++){
            res += minDir[i];
        }
        System.out.println(res);
        
        
        
        
        
        /*/打印邻接矩阵
        for(int i = 0; i<v+1;i++){
            for(int j = 0; j<v+1; j++){
                System.out.print(grid[i][j]+" ");
            }
            System.out.println();
        }
        //*/
    }
}
相关推荐
Rotch10 分钟前
核密度估计(KDE)(一)
算法
NAGNIP21 分钟前
一文理解 PPO 的核心机制与大模型中的应用
算法
nju_spy31 分钟前
机器学习 - Kaggle项目实践(6)Dogs vs. Cats Redux: Kernels Edition 猫狗二分类
人工智能·算法·机器学习·计算机视觉·分类·南京大学·残差神经网络
yuan199972 小时前
MATLAB中的蛙跳算法实现
算法·matlab
pan0c232 小时前
KNN算法(K近邻算法)
算法·近邻算法
技术小泽3 小时前
JVM之CMS、G1|ZGC详解以及选型对比
java·jvm·后端·算法·性能优化
THMAIL4 小时前
随机森林的 “Bootstrap 采样” 与 “特征随机选择”:如何避免过拟合?(附分类 / 回归任务实战)
人工智能·算法·决策树·随机森林·分类·bootstrap·sklearn
草莓熊Lotso5 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day16
c语言·开发语言·经验分享·算法·强化
君万6 小时前
【LeetCode每日一题】21. 合并两个有序链表 2. 两数相加
算法·leetcode·链表
神里流~霜灭7 小时前
Fourier 级数展开(案例:级数展开 AND 求和)
c语言·c++·算法·matlab·fourier 级数展开·级数展开求和·fourier算法