prim算法基础详解(无向赋权图的最小生成树MST)
来源:互联网 发布:查看本机的mac地址 编辑:程序博客网 时间:2024/05/21 17:14
带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法
生成树的概念:联通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树 生成树是联通图的极小连通子图。
所谓极小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之变成非连通图。生成树各边的权值总和称为生成树的权。
权最小的生成树称为最小生成树,常用的算法有prime算法和kruskal算法。这里仅介绍prime算法..
算法描述如下:
1.将所有的结点分成两个集合。一部分是在最小生成树中的点(记为集合A),另一部分是不在最小生成树中的点(即待加入的点,记为集合B)。
2.开始的时候取任意一个点v作为顶点加入最小生成树中(A),然后遍历集合B,选取一个点vj使得(v,vj)的权值最小,然后将vj加入A集合,B集合中删去vj(删去操作可以用一个intree[i]数组来进行操作)
3.重复2步骤直到所有点遍历完毕。
注意:这里说的重复步骤2是指每次找的与顶点v的边权值最小的结点!
结合例子来看一下。(如下图)
选择1为初始结点,intree[1]标记为1.
遍历剩下的6个结点,找到(1,vj)中weight最小的那一个,显然是3,让3加入集合A,即intree[3]标记为1
然后注意此时集合A中有了两个元素(结点1和结点3)开始的时候我认为是从3开始遍历找3与其他点的最小权值,但是再次注意我们每次只找与顶点(这里就1结点)边权值最小的点。
3结点入队后,1就可以与5结点间接相连了,所以每次在A中加入一个结点,都要更新顶结点与其他结点的关联与否以及权值。
这一点非常重要是算法的重要步骤。
正如此时(1,5) = 8 (1,4) = 5 (1,2) = 6 ,显然下一次应该加入A集合的是点4,所以:
接下来就是:
附上代码及测试样例。
c代码
#include<stdio.h>
#include<stdlib.h>
#definemax1000000000;
inta[1001][1001],d[1001],p[1001];
intmain(){
inti,j,k,m,n,min,ans,t;
intx,y,z;
scanf
(
"%d%d"
,&n,&m);
for
(i=1;i<=m;i++){
scanf
(
"%d%d%d"
,&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
for
(i=1;i<=n;i++)
d[i]=1000000000;
d[1]=0;
for
(i=2;i<=n;i++){
min=max;
for
(j=1;j<=n;j++)
if
(!p[j]&&min>d[j])
min=d[j];
t=j;
}
p[t]=j;
for
(j=1;j<=n;j++)
if
(a[t][j]=0&&d[j]>a[t][j]){
d[j]=a[t][j];
ans+=min;
}
printf
(
"%d"
,ans);
return0;
}
- prim算法基础详解(无向赋权图的最小生成树MST)
- prim算法基础详解(无向赋权图的最小生成树MST)
- 无向网的最小生成树(Prim算法)
- 无向图的最小生成树(prim算法)
- 无向图最小生成树(prim算法)
- 无向图的最小生成树算法的C程序实现代码(Prim算法)
- 图:最小生成树:prim算法 普里姆算法 ,(无向图的实现)
- 最小生成树(MST)Prim算法 贪心算法
- Prim算法实现最小生成树MST
- Prim算法求MST(最小生成树)
- prim算法 最小生成树MST
- 最小生成树,MST,Prim算法,poj2485
- 最小生成树MST -- Prim 算法实现
- 算法导论 最小生成树 MST-PRIM
- 图的最小生成树(MST)之Prim算法
- 图的最小生成树MST--Prim算法
- 数据结构基础6.3:最小生成树MST(Prim、Kruskal)
- 最小生成树(MST)之Prim算法
- python链表的增删改查
- 理解Power Systems下的处理器利用率
- C++设计模式——单例模式
- NSD基础交换-Vlan间路由
- 使用JDBC驱动程序访问数据库
- prim算法基础详解(无向赋权图的最小生成树MST)
- java -server 和 -client 的不同,及 java -server 时抛错原因
- php设计模式之单例模式
- c++ Map关联容器学习(一)
- laravel框架的rbac
- SSL2779 2017年10月21日提高组 Heatwave(lca+rmq)
- 服务框架—基于JAVA实现远程过程调用RMI实验
- 如何在window下使用CMD编译cpp
- C语言中如何将二维数组作为参数传递