首页 > 其他分享 >Prim

Prim

时间:2024-08-03 21:50:33浏览次数:10  
标签:Prim int graph 最小 顶点 visited dist

Prim

Prim 算法是一种用于解决最小生成树(Minimum Spanning Tree)问题的贪心算法。它通过不断选择与当前生成树连接的最小权重边来逐步构建最小生成树。

具体流程如下:

  1. 创建一个空的最小生成树 MST 和一个空的集合 visited,用于存放已经被访问过的顶点。
  2. 选择一个起始顶点,将其加入 visited 集合中。
  3. 从 visited 集合中选择一条边的权重最小的边,该边的另一端顶点不在 visited 集合中。
  4. 将该边加入 MST,并将该边的另一端顶点加入 visited 集合中。
  5. 重复步骤 3 和 4,直到 MST 中包含了所有顶点。
  6. 最终得到的 MST 就是最小生成树。

java 代码模板如下:

int[][] primMST(int[][] graph) {
 int V = graph.length; // 顶点数
 int[][] mst = new int[V][V]; // 最小生成树
 boolean[] visited = new boolean[V]; // 记录顶点是否被访问过
 int[] dist = new int[V]; // 记录顶点到最小生成树的距离

 // 初始化距离为无穷大,将起始顶点设为0
 for (int i = 0; i < V; i++) {
  dist[i] = Integer.MAX_VALUE;
 }
 dist[0] = 0;

 // 构建最小生成树
 for (int i = 0; i < V - 1; i++) {
  int u = minDistance(dist, visited);
  visited[u] = true;
  // 通过当前节点更新其他节点到树的距离和到树的边
  for (int v = 0; v < V; v++) {
   if (graph[u][v] != 0 && !visited[v] && graph[u][v] < dist[v]) {
    mst[u][v] = graph[u][v];
    mst[v][u] = graph[u][v];
    dist[v] = graph[u][v];
   }
  }
 }
 return mst;
}
// 获取距离树最近的点
int minDistance(int[] dist, boolean[] visited) {
 int min = Integer.MAX_VALUE;
 int minIndex = -1;
 for (int v = 0; v < dist.length; v++) {
  if (!visited[v] && dist[v] < min) {
   min = dist[v];
   minIndex = v;
  }
 }
 return minIndex;
}

标签:Prim,int,graph,最小,顶点,visited,dist
From: https://www.cnblogs.com/licwuu/p/18341155

相关文章

  • c primer plus 第三章 数据与C 3.43 char类型
    一、什么是char?**char类型用于储存字符,char是整数类型(char实际储存的是整数而不是字符)char通过转换ASCII编码来表示字母、标点或符号。eg:char=‘A’等于char=65**C语言把一字节定义位char类型占用的位数,即8bit,因此各种系统都能使用char类型二、char的使用与特性1、声明char......
  • C primer plus 4.23 strlen函数
    一、strlen函数    **用来给出字符串的长度#include<stdio.h>#include<string.h>#definePRAISAE"Youareamextraordinarybeing."intmain(void) {   charname[40];   printf("Whatyourname?");      scanf("%s",nam......
  • C primer plus 第四章 4.2字符串简介
    一、什么是字符串:    是一个或多个字符的序列(被双引号引起来的就是字符串),单引号引起来的是字符,字符串=字符+空字符二、char类型和null字符:    *C中没有专门储存字符串的变量,字符串被储存在char类型的数组中。     数组:由连续的储存单元组成,字符串......
  • prim算法求最小生成树
    prim算法求最小生成树#include<bits/stdc++.h>usingnamespacestd;constintN=600;intg[N][N];//n的平方约等于m,所以用邻接矩阵,存放权值。g[i][j]表示边ij的长度为g[i][j]constintinf=0x3f3f3f3f;//无穷大0x3f3f3f3fintdist[N];//该点到集合里点的最小值boolst[N]......
  • CF1178D Prime Graph 题解
    首先考虑一个问题:如果没有边数是素数的限制,应该怎么构造?这其实很简单,把原图连成一个环即可,每个点度数为\(2\)。接着考虑在原图上加边,注意到\(3\)也是个素数,所以每次可以任意选两个度数为\(2\)的点连边,此时仍然符合条件。这样加边最多可以加\(\left\lfloor\frac{n}{2}\rig......
  • 山东大学数据结构与算法实验13最小生成树(Prim算法/Kruskal算法)
    A : Prim算法题目描述使用prim算法实现最小生成树输入输出格式输入第一行两个整数n,e。n(1≤n≤200000)代表图中点的个数,e(0≤m≤500000)代表边的个数。接下来e行,每行代表一条边:ijw 表示顶点i和顶点j之间有一条权重为w的边输出最小生成树所有边的......
  • C Primer Plus 第三章的3.1程序运行不了,请问有没有大佬能教教我
    #include<stdio.h>intmain(void){floatweight;floatvalue;printf("Areyouworthyourweightinplatinum?\n");printf("Let'scheckitout.\n");printf("Pleaseenteryourweightinpounds:15.0......
  • Cxx primer-chap9-Sequential Containers
    容器就是某种特定类型的集合。容器之间会提供一些公用的接口,此外没有哪种容器是最优的,只有适合的:sequential容器类型:各个容器的优缺点概览:,其中array和forward_list是新标准添加的。库实现的容器较快,鼓励使用:一些经验之谈,其中vector擅长随机访问,list删除随机增删,如果你不确......
  • C++ primer plus 第16章string 类和标准模板库, 函数符概念
    C++primerplus第16章string类和标准模板库,函数符概念C++primerplus第16章string类和标准模板库,函数符概念文章目录C++primerplus第16章string类和标准模板库,函数符概念16.5.1函数符概念程序清单16.15functor.cpp16.5.1函数符概念正如STL定......
  • C++ primer plus 第16章string 类和标准模板库, 函数对象
    C++primerplus第16章string类和标准模板库,函数对象C++primerplus第16章string类和标准模板库,函数对象文章目录C++primerplus第16章string类和标准模板库,函数对象16.5函数对象16.5函数对象很多STL算法都使用函数对象–也叫函数符(fiunctor)。......