最小生成树——Prim、Kruskal

最小生成树——Prim、Kruskal

1、问题

在这里插入图片描述

2、算法标签

1、Prim
2、Kruskal

3、实现代码

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<vector>
#include<deque>
#include<set>
#include<queue>
#include<map>
#include<stack> 
#include<cmath>
#include<time.h>
#include<iomanip>
using namespace std;
typedef long long int ll;
#define MAX 1000000
/*
  A B C D E F G 
A M 2 M 5 M 8 M
B 2 M 7 7 2 M M
C M 7 M M 3 M M
D 5 7 M M 6 7 3 
E M 2 3 6 M M 4
F 8 M M 7 M M 4
G M M M 3 4 4 M
*/

void prim(){
	cout<<"==============Prim算法构建最小生成树=============="<<endl;
	int nums[7][7]={{MAX,2,MAX,5,MAX,8,MAX},
					{2,MAX,7,7,2,MAX,MAX},
					{MAX,7,MAX,MAX,3,MAX,MAX},
					{5,7,MAX,MAX,6,7,3},
					{MAX,2,3,6,MAX,MAX,4},
					{8,MAX,MAX,7,MAX,MAX,4},
					{MAX,MAX,MAX,3,4,4,MAX}};
	vector<int> tree(1,0);
	int isintree[7]={1,0,0,0,0,0,0};
	char pointname[7]={'A','B','C','D','E','F','G'};
	int totalvalue=0;
	cout<<"加入"<<"A"<<endl;
	while(tree.size()<7){
		int next=0;
		int nextvalue=MAX;
		for(int i=0;i<tree.size();i++){
			for(int j=0;j<7;j++){
				if(!isintree[j]&&nums[tree[i]][j]<nextvalue){
					nextvalue=nums[tree[i]][j];
					next=j;
				}
			}
		}
		cout<<"加入"<<pointname[next]<<endl;
		totalvalue+=nextvalue;
		isintree[next]=1;
		tree.push_back(next);
	}
	cout<<"Prim算法构建最小生成树路径权值为:"<<totalvalue<<endl; 
}


typedef struct{
	char p1;
	char p2;
	int edge;
	void ini(char a, char b,int l){
		p1=a;
		p2=b;
		edge=l;
	}
}node; 

bool cmp(node a,node b){
	return a.edge<b.edge;
}

void init(node nd[12]){
	nd[0].ini('A','B',2);
	nd[1].ini('B','C',7);
	nd[2].ini('A','D',5);
	nd[3].ini('B','D',7);
	nd[4].ini('B','E',2);
	nd[5].ini('C','E',3);
	nd[6].ini('A','E',8);
	nd[7].ini('F','D',7);
	nd[8].ini('D','E',6);
	nd[9].ini('E','G',4);
	nd[10].ini('D','G',3);
	nd[11].ini('F','G',4);
	sort(nd,nd+12,cmp);
}

int findfar(int far[],int p){
	if(far[p]!=p){
		far[p]=findfar(far,far[p]);
	}
	return far[p];
}

int connect(int far[],int pa,int pb){
	if(far[pa]==pa&&far[pb]==pb){
		far[pb]=far[pa];
	}
	else if(far[pa]!=pa&&far[pb]==pb){
		far[pb]=findfar(far,pa);
	}
	else if(far[pa]==pa&&far[pb]!=pb){
		far[pa]=findfar(far,pb);
	}
	else{
		int tempfar=findfar(far,pb);
		far[tempfar]=findfar(far,pa);
	}
}


void Kruskal(){
	cout<<"==============Kruskal算法构建最小生成树=============="<<endl;
	node nd[12];
	init(nd);
	int totalvalue=0;
	int far[7]={0,1,2,3,4,5,6};
	for(int i=0,time=0;i<12&&time<7;i++){
		int pa=nd[i].p1-'A';
		int pb=nd[i].p2-'A';
		if(findfar(far,pa)!=findfar(far,pb)){
			connect(far,pa,pb);
			cout<<"加入边:"<<nd[i].p1<<"--"<<nd[i].p2<<endl;
			totalvalue+=nd[i].edge;
			time++;
		}
	}
	cout<<"Kruskal算法构建最小生成树路径权值为:"<<totalvalue<<endl; 
}

 
int main(){
	//算法开始起始时间 
	clock_t start_time = clock(); 
	//调用归并排序算法函数 
	prim();
	//算法完成截止时间 
	clock_t end_time = clock();
	cout<<"Prim算法构建最小生成树消耗时间为:"<<(end_time-start_time)<<"ms!"<<endl<<endl;
	
	//算法开始起始时间 
	start_time = clock(); 
	//调用归并排序算法函数 
	Kruskal();
	//算法完成截止时间 
	end_time = clock();
	cout<<"Kruskal算法构建最小生成树消耗时间为:"<<(end_time-start_time)<<"ms!"<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值