prim最小生成树

#include<bits/stdc++.h>
using namespace std;
#define MaxSize 10
#include<queue>
class Mgragh{
	private:
		int vertex[MaxSize];//顶点
		int arc[MaxSize][MaxSize];//矩阵
		int vertexNum,arcNum;
		int visited[MaxSize]={0};
	public:
		Mgragh(int a[],int n, int e){
			vertexNum = n;
			arcNum = e;
			int i,j;
			for(i = 0;i<vertexNum;i++){
				vertex[i]=a[i];
			}
			for(i = 0;i<vertexNum;i++){
				for(j = 0;j<vertexNum;j++){
					arc[i][j]=2147483647;
				}
			}
			for(int k = 0;k<arcNum;k++){
				int weight;
				cin>>i>>j>>weight;
				arc[i][j]=weight;
				arc[j][i]=weight;
			}
		}
		void printMgragh(){
			for(int i=0;i<vertexNum;i++){
				for(int j=0;j<vertexNum;j++){
					cout<<arc[i][j]<<" ";
				}
				cout<<endl;
			}
		}
		void Prim_Print(){
			int lowcost[vertexNum],adjvex[vertexNum];
			lowcost[0]=0;
			adjvex[0]=0;
			for(int i=0;i<vertexNum;i++){
				lowcost[i]=arc[0][i];
				adjvex[i]=0;
			}
			for(int i=1;i<vertexNum;i++){
				int minCost=2147483647;//先将最小代价设为最大
				int k=0;
				for(int j=1;j<vertexNum;j++){
					if(lowcost[j]!=0&&lowcost[j]<minCost){
						minCost=arc[0][i];//使代价降到最低
						k=j;
					}
				}
				if(k){
					cout<<"(V"<<adjvex[k]<<"V"<<k<<")"<<endl;
				}
				lowcost[k]=0;//防止后面再次遍历到该边
				for(int j=1;j<vertexNum;j++){
					if(lowcost[j]!=0&&arc[k][j]<lowcost[j]){//如果k的与其他点的权值小于原本的最小权值
						lowcost[j]=arc[k][j];
						adjvex[j]=k;//标记该点和其他点已经相连
					}
				}
			}
		}
};
int main()
{
	int arr[]={0,1,2,3,4,5};
	Mgragh m(arr,6,10);
	m.printMgragh();
	cout<<endl;
	m.Prim_Print();
}
  • 选择一个起始顶点,将其加入最小生成树中;
  • 在剩余的顶点中,选择一个与已加入的顶点相连的边权最小的顶点,将其加入最小生成树中;
  • 重复上述过程,直到最小生成树包含所有顶点。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值