Prim算法

本文介绍了Prim算法,用于寻找连通网的最小生成树。算法从一个顶点开始,逐步添加权值最小的边,直到构建出包含所有顶点的生成树。详细步骤包括初始化、重复选择权值最小边等,并给出了具体的代码实现。Prim算法在城市电网建设等实际应用中,有助于降低建设成本。同时提到了Kruskal算法作为另一种求解最小生成树的方法。
摘要由CSDN通过智能技术生成

@[TOC]最小生成树

关于图的几个概念定义:

  • 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。
  • 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。
  • 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
  • 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
  • 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
    在这里插入图片描述

1.Prim算法

算法步骤如下:
假设G=(V,E)是一个具有n个顶点的带权连通图,T=(U,TE)是G的最小生成树,其中U是T的顶点集,TE是T的边集,则由G构造从起始点v出发的最小生成树T的步骤如下:
(1)初始化U={v},以v到其他顶点的所有边为候选边。
(2) 重复一下步骤(n-1)次,使得其他(n-1)个顶点被加入到U中。
① 从候选边中挑选权值最小的边加入TE,设该边在V-U中的顶点是k,将k加入U中;
② 考查当前V-U中的所有顶点j,修改候选边,若(k,j)的权值小于原来和顶点j关联的候选边,则用(k,j)取代后者作为候选边。
在这里插入图片描述

细节处理:

在这里插入图片描述
在这里插入图片描述

具体代码:

结构体设计

#define MAXV 30			//最多的顶点数
#define INF 0x3f3f3f3f //定义无穷大
typedef struct
{
	int no;		//顶点的编号
	string info;	//顶点的其他信息
}Vtype;				//顶点的类型
typedef struct matgraph
{
	int edges[MAXV][MAXV]={};		//邻接矩阵数组
	int n,e;					//顶点数边数
	Vtype vexs[MAXV];	//存放顶点信息
}MatGraph;

算法实现

// Prim算法
void Prim(MatGraph g,int v)
{
	int lowcost[MAXV];
	int min;
	int closest[MAXV],i,j,k;
	for(i=0;i<g->n;i++)
	{
		lowcost[i]=g->edges[v][i];
		closest[i]=v;
	}
	for(i=1;i<g->n;i++)
	{
		min=INF;
		//在未加入顶点集合V-U中找离已选顶点集合U最近的顶点K
		for(j=0;j<g->n;j++)
		{
			if(lowcost[j]!=0&&lowcost[j]<min)
			{
				min=lowcost[j];
				k=j;		//k记录最近顶点的编号
			}
		}
		printf("边(%d,%d)造价为:%d\n",closest[k],k,min);
		lowcost[k]=0;

		for(j=0;j<g->n;j++)
		{
			if(lowcost[j]!=0&&g->edges[k][j]<lowcost[j])
			{
				lowcost[j]=g->edges[k][j];
				closest[j]=k;
			}
		}
	}
}

实际应用

随着我国社会经济的飞速发展,人们对电力能源的需求也随之不断增加,不论是人们的生产还是生活,电能都占据着非常重要的位置.在电力系统中,电网是其中非常关键的设施,同时也是电力系统重要的基础.但是从现阶段我国电网建设规划与运行改造的实际情况来看,其中依然存在着一些问题有待解决。为了确保电网建设能够满足人们日益增长的用电需求,应该积极采取相应的措施解决这些问题,以此不断改进和优化电网建设实际应用中可以用在城市间的电网建设,减少建设造价。因此Prim算法可以用在建设城市间的电网,从而减少造价。

扩展

还可以参考学习Kruskal算法,同样为最小生成树的算法。
[https://blog.csdn.net/qq_37618797/article/details/81159535]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值