Prim算法C++实现

cv直接运行

#include<iostream>
#include<queue>
using namespace std;
#define MaxVertexNum 100
#define INFINITY INT_MAX                                            //最大值无穷 
typedef int VertexType;                                             //定义顶点的数据类型为int类型
typedef int EdgeType;                                               //带权图边上权值的数据类型
typedef struct{
	VertexType Vex[MaxVertexNum];                                   //顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum] ;                     //边集数组(邻接矩阵) 
	int vexnum,arcnum;                                              //当前的顶点数和弧数 
}MGraph;                                                            //对于边集数组可以考虑采用矩阵压缩的技术存储
                                                                    //这里使用邻接矩阵来实现网的存储
void CreateUDN23(MGraph &G)                                           //使用邻接矩阵创建无向图 
{
	cout<<"请输入图的顶点数和边数:"<<endl; 
	cin>>G.vexnum;                                                  //输入网的边数
	cin>>G.arcnum;                                                  //输入顶点数
	for(int i=1;i<=G.vexnum;i++)
	{
		int a;
		G.Vex[i]=i;                                                 //初始化顶点数组 
		
	}
	for(int i=1;i<=G.vexnum;i++)                                    //对邻接矩阵进行初始化 ,将任意两点的距离设置为无穷即不可达到 
	{
		for(int j=1;j<=G.vexnum;j++)
			G.Edge[i][j]=INFINITY;        
	}
	for(int i=1;i<=G.arcnum;i++)                                     //录入边来初始化邻接矩阵 
	{
		cout<<"请输入第"<<i<<"条边的两端的顶点以及权值(以空格间隔):"<<endl;
		int a=0,b=0,height=0;
		cin>>a;
		cin>>b;
		cin>>height;
		G.Edge[a][b]=height;
		G.Edge[b][a]=height;     
		
	}
}
	//prim算法的具体实现
	void MiniSpanTree_Prim(MGraph G,int m)                           //参数中MGraph表示我们要生成最小树的网,i表示我们第一个要加入最小生成树的顶点(根结点) 
	{
		int min,i,j,k;
		int adjvex[MaxVertexNum];                                    //用来记录顶点,记录的方式为,例如adjcex[3]=2,表示当前顶点与最小生成树集合(即已经纳入到最小生成树的顶点的集合)的最短边的另一端顶点,
																     //这个所谓的另一端的顶点一定已经存在在最小生成树这个集合中间了 
		int lowcost[MaxVertexNum];
		adjvex[m]=m;                                                 //初始化第一个顶点的下标为i
		for(i=1;i<=G.vexnum;i++)
		{
			lowcost[i]=G.Edge[m][i];                                 //将与顶点m有关的邻接矩阵中的边的信息纳入到lowcost数组中,表示顶点m与其它所有顶点的关系(要么邻接,则lowcost保存两点之间权值,否则为∞)
			adjvex[i]=m;
		}
		lowcost[m]=0;                                                 //将m加入到最小生成树中 
		//上面是准备工作
		for(int i=1;i<G.vexnum;i++)
		for(i=1;i<G.vexnum;i++)
		{
			min=INFINITY;
			int j=1,k=0;
			while(j<=G.vexnum)                                        //这个循环所找出与当前结点最近的那个点,通过扫描lowcost数组 
			{
				if(lowcost[j]!=0&&lowcost[j]<min)
				{
					min=lowcost[j];
					k=j;                                              //将最小权值的顶点下标保存到k中 
				}
				j++;
			}
			cout<<"("<<adjvex[k]<<","<<k<<")"<<endl;
			lowcost[k]=0;                                             //表示当前顶点已经加入到最小生成树中了 
			for(j=1;j<=G.vexnum;j++)
			{
				if(lowcost[j]!=0 &&G.Edge[k][j]<lowcost[j])           //所有纳入的顶点看成一个整体 
				{
					lowcost[j]=G.Edge[k][j];
					adjvex[j]=k;
				}
			 } 
		 } 
 }  
 int main()
 {
 	MGraph graph;
 	CreateUDN23(graph);
 	MiniSpanTree_Prim(graph,1);
 	return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值