数据结构——最小生成树之prime算法(与最短路径之迪杰斯特拉算法很像)

最小生成树之prime算法

***最小生成树:一个连通图的生成树中,所有边的权值加起来最小的生成树;称为最小生成树;
【简介】:Prime算法可在加权连通图里搜索最小生成树。即:所有边的权值之和为最小。
Prime算法是图论中求最小生成树的一种算法,与之类似的算法还有Kruskal算法;
区别:

Prime算法适合边多定点少的图;
Dijkstra算法适合边少定点多的图;

1.1 存图方式

要求最小生成树,当然首先要把图存进一个东西中,这样才能图对进行搜索操作。
1.邻接矩阵

存图思想:用一个矩阵来记录一个图,矩阵第 i 行第 j 列的值就表示顶点 i 到顶点 j 的权值

int matrix[MAX][MAX]={
   0};//邻接矩阵存储图
void init(){
   //初始化 min_distance[N];visited[N];数组

	 memset(visited,0,sizeof(visited));
	 for(int i=1;i<=nodeNum;i++){
   
	 	for(int j=1;j<nodeNum;j++){
   
	 		if(i == j)
			 	matrix[i][j]=0;
			else
				matrix[i][j]=INF;		 
		 }
	 } 
	
}
	init(); 
	for(int i=1;i<=nodeNum;i++){
   
		for(int j=1;j<=nodeNum;j++){
   
			cin>>matrix[i][j];
		}
	}

1.2 Prime算法分解

1.2.1 用到的数组

我写的这个Prime算法存图用的是邻接矩阵。
int min_distance[MAX]; //记录该结点到生成树的最短路径
难点在于理解min_distance数组为每个结点到生成树的最短路径

int  min_distance[MAX];     //记录该结点到生成树的最短路径 
bool visited[MAX];		//标记数组,标记该结点是否纳入集合,即该结点是否访问过;false 没有被访问 

1.2.2 初始化

初始化:自己与自己的距离为0,自己与别的结点的距离初始化为无穷大,即,表示不连通;
将所有的结点都标记为为访问,我这用false表示未访问,true表示已访问;

void init(){
   //初始化 min_distance[N];visited[N];数组

	 memset(visited,0,sizeof(visited));
	 for(int i=1;i<=nodeNum;i++){
   
	 	for(int j=1;j<nodeNum;j++){
   
	 		if(i == j)
			 	matrix[i][j]=0;
			else
				matrix[i][j]=INF;		 
		 }
	 } 
	
}

1.2.3 Prime算法主体

传入一个节点,当然,传入的这个节点是随意的。将这个点到其他点的距离存入min_distance数组,并将传入的这个点标记为已访问。
然后找出从start(传入的那个点)出发的路径中的最短的一个路径;并将它到达的那个点记性并标记。然后更新min_distance数组(重点):如果该结点没有被访问过,且点距离当前点的距离更近,就执行更新;最后min_distance数组中就是最小生成树的最短路径的集合;对其求和,即是最小生成树的最短路径;
代码实现:

int prime(int start){
   
//start是任意一个开始结点,此节点随意;将st看做最小生成树的根节点
//开始结点的处理 
	 int i;
	for(i=1;i<=nodeNum;i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值