prim算法实现c++描述

本文详细介绍了Prim算法在C++中的实现步骤,包括邻接矩阵存储图、计算最短边和逐步构建最小生成树的过程。通过实例演示了如何初始化数据、寻找最小权值边以及更新候选最短边集,最终输出最小生成树的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

prim算法的实现c++描述

题目描述:求下图的最小生成树
先附上答案:

最小生成树为:U{v0,v5,v2,v3,v4,v1}


由于在算法的执行过程中,需要不断的读取任意两个顶点的权值,所以图采用邻接矩阵的存储方式比较好
U={ V0 }

V-U={V1,V2,V3,V4,V5}
shortEdge={ (V0,V1)34, (V0,V2)46,(V0,V3) ,(V0,V4)(V0,V5)19}

prim的核心思想是在集合U和剩余集合之间的所有节点,计算出它们的权值如(V0,V1)的权值为34 (V0,V3)的权值为 , 是因为v0和v3之间没有直达边的所以设置为无穷大

我们发现shortEdge集合里面(V0,V5)19的权值最小,然后把v5放到集和U中
U={V0 ,V5 }
V-U={V1,V2,V3,V4}
shortEdge={ (V0,V1)34,(V5,V2)25,(V5,V3)25,(V5,V4)26}
在将最小权值的节点放入到U集合里U={V0 ,V5 ,V2}.然后以此类推…最后将V-U的最后一个节点放入到集合U中就完成了最小生成树算法

数据结构的设计,设置候选最短边集shortEdge,包括adjvex[ ]和lowcost[ ] 两个域数组,分别保存候选最短边的顶点和权值…。。。。(¬_¬)好困。。。最接附代码把…

#include <bits/stdc++.h>
using namespace std;
const int MAX=10;
int vertex[MAX]; //顶点数组 
int vertexNum;//顶点数  
int arcNum;//边数 
struct matrix{
	int weight; 
}arc[MAX][MAX];//边数组--带权的矩阵 
struct path {
	int adjvex[MAX];
	int lowcost[MAX];
}shortEdge; //候选最短边集  

//数据的初始化   
void input(){ //输入格式为  节点数,边数,每个节点的值,某两个节点之间的关系和权值   如 6  9   0 1 2 3 4 5      0 1 9     这里的节点是从0开始的 
	int vi,vj,weight; //vi  vj 代表是那两个节点之间有关系(下标)    weigt是节点之间的权值 
	cin>>vertexNum;   //要设置几个节点
	cin>>arcNum;//设置几条边 
	for(int i=0;i<vertexNum;i++){  //对每个节点赋值 
		cin>>vertex[i];
	}
	for(int i=0;i<vertexNum;i++){  //边的关系数组初始化9999 表示无穷大---节点之间没有关系 
		for(int j=0;j<vertexNum;j++){
			arc[i][j].weight=9999;
		}
	} 
	for(int i=0;i<arcNum;i++){  
		cin>>vi>>vj>>weight;          
		arc[vi][vj].weight=weight;
		arc[vj][vi].weight=weight;
	}
} 
//用来寻找 shortEdge里最小权值的节点的下标 
int minEdge(path Se ,int num){
	int k=0;
	for(int i=0;i<num;i++){
		if(Se.lowcost[i]!=0 && Se.lowcost[i]!=9999){
			k=i;
			break;
		}
	}
	for(int i=0;i<num;i++){
		if(Se.lowcost[i]!=0 && Se.lowcost[i]<Se.lowcost[k]){
			k=i;
		}
	}
	return k;
}
void outputMST(int k,path putSe){  //输出最小生成树的路径 
	cout<<"("<<putSe.adjvex[k]<<","<<k<<")"<<putSe.lowcost[k]<<"   ";
} 
void Graph(int start){
	int k;//最短边的下标 
	for(int i=0;i<vertexNum;i++){  //对shortEdge辅助数组初始化 
		shortEdge.adjvex[i]=start;
		shortEdge.lowcost[i]=arc[start][i].weight;
	}
	shortEdge.lowcost[start]=0; //将起点start放入集合U 
	
	for(int i=0;i<vertexNum-1;i++){
	k=minEdge(shortEdge,vertexNum);	//在shortEdege数组里寻找最小权值的节点的下标 
	outputMST(k,shortEdge);	//输出最小权值的节点 
	shortEdge.lowcost[k]=0;   //将顶点K加入到集合U中   	U是最小路径关系的集合           V是全部的节点关系的集合 
	for(int j=0;j<vertexNum;j++){ //对shortEdge数组进行更新 
		if(arc[k][j].weight<shortEdge.lowcost[j]){
			shortEdge.adjvex[j]=k;
			shortEdge.lowcost[j]=arc[k][j].weight;
			}
		}
	} 
}
int main(){
	input();
	Graph(0);
	return 0;
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值