首页 > 编程语言 >最小生成树prim算法实现

最小生成树prim算法实现

时间:2022-10-11 16:02:12浏览次数:58  
标签:map prim pos 最小 算法 low 权值 visited



最小生成树prim算法实现_数组

今天从志权师兄那里学会了最小生成树。所谓生成树,就是n个点之间连成n-1条边的图形。而最小生成树,就是权值(两点间直线的值)之和的最小值。

  

         首先,要用二维数组记录点和权值。如上图所示无向图:

int map[7][7];
map[1][2]=map[2][1]=4;
map[1][3]=map[3][1]=2;
......

      然后再求最小生成树。具体方法是:

1.先选取一个点作起始点,然后选择它邻近的权值最小的点(如果有多个与其相连的相同最小权值的点,随便选取一个)。如1作为起点。

visited[1]=1;
pos=1;
//用low[]数组不断刷新最小权值,low[i](0<i<=点数)的值为:i点到邻近点(未被标记)的最小距离。
low[1]=0; //起始点i到邻近点的最小距离为0
low[2]=map[pos][2]=4;
low[3]=map[pos][3]=2;
low[4]==map[pos][4]=3;
low[5]=map[pos][5]=MaxInt; //无法直达
low[6]=map[pos][6]=MaxInt;

2.再在伸延的点找与它邻近的两者权值最小的点。
//low[]以3作当前位置进行更新
visited[3]=1;
pos=3;
low[1]=0; //已标记,不更新
low[2]=map[1][2]=4; //比5小,不更新
low[3]=2; //已标记,不更新
low[4]=map[3][4]=1;
low[5]=map[1][5]=MaxInt;//无法直达,不更新
low[6]=map[3][6]=2;

 

    3.如此类推...



最小生成树prim算法实现_权值_02

 

 


     当所有点都连同后,结果最生成树如上图所示。


     所有权值相加就是最小生成树,其值为2+1+2+4+3=12。

     至于具体代码如何实现,现在结合POJ1258例题解释。代码如下:

#include <stdio.h>        
#include <string.h>
#define MaxInt 0x3f3f3f3f
#define N 110
//创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
int map[N][N],low[N],visited[N];
int n;

int prim()
{
int i,j,pos,min,result=0;
memset (visited,0, sizeof (visited));
//从某点开始,分别标记和记录该点
visited[1]=1;pos=1;
//第一次给low数组赋值
for (i=1;i<=n;i++)
if (i!=pos) low[i]=map[pos][i];
//再运行n-1次
for (i=1;i<n;i++)
{
//找出最小权值并记录位置
min=MaxInt;
for (j=1;j<=n;j++)
if (visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
//最小权值累加
result+=min;
//标记该点
visited[pos]=1;
//更新权值
for (j=1;j<=n;j++)
if (visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
return result;
}

int main()
{
int i,v,j,ans;
while ( scanf ( "%d" ,&n)!=EOF)
{
//所有权值初始化为最大
memset (map,MaxInt, sizeof (map));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf ( "%d" ,&v);
map[i][j]=map[i][j]=v;
}
ans=prim();
printf ( "%d\n" ,ans);
}
return 0;
}

标签:map,prim,pos,最小,算法,low,权值,visited
From: https://blog.51cto.com/u_12911014/5746515

相关文章

  • jvm 虚拟机 探秘 结构 内容 gc 算法 gc 选择 和不同场景配置 示例
    目录​​1.介绍​​​​2.虚拟机组成​​​​2.1.数据隔离区域​​​​2.1.1.程序计数器​​​​2.1.2.jvm虚拟机栈​​​​2.1.3.本地方法栈​​​​2.2.数据共享区域​​......
  • Problem P25. [算法课回溯]找出所有子集的异或总和再求和
    简单的一道回溯题,具体解法看代码,有注释#include<iostream>#include<bits/stdc++.h>#include<cstdio>#include<string>usingnamespacestd;intret=0;void......
  • LSTM算法实践系列(二)
    初步了解算法概念算法作为抽象概念,在实际生活中发挥了极大的具象作用:打工人如何保证最节省时间又花费最少来选择每天必须的通勤路径及方式,如何调度员工在有限时间内更高效的......
  • 算法基础(五)| 差分算法及模板详解
    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有......
  • 35-70K*14薪| 梅卡曼德2D/3D视觉、深度学习算法专家等岗位招聘
    公司介绍梅卡曼德机器人由清华海归团队于2016年创办,致力于推动智能机器人无所不在的存在,总部位于北京和上海,在深圳、长沙、青岛、慕尼黑、东京等地有布局。AI+3D+工业机器人......
  • 搜索中常见数据结构与算法探究(一)
    1前言ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题:第一篇主要介绍数据结构和算法基础和分......
  • Leecode 111.二叉树的最小深度
    /**Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*......
  • java 算法
    一、集合与数组的转换1、初始化一个固定大小的List:List<Integer>ali=Arrays.asList(1,2,3,4,5);该ali内容可以修改,但是大小不可变  如果要创建一个可变大小的Li......
  • 算法练习-第十五天【二叉树】
    二叉树226.翻转二叉树参考:代码随想录思路翻转二叉树的方式:递归迭代法层序遍历1.递归前序遍历/***Definitionforabinarytreenode.*typeTreeNodes......
  • 数据算法--Hadoop-Spark大数据处理技巧 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1SCA5hN-0ZbEK_uHZgpBkVg点击这里获取提取码 ......