用贪心算法求解最小生成树

一、实验要求与目的

  1. 熟悉贪心算法的基本原理与适用范围。
  2. 使用贪心算法编程,求解最小生成树问题。

二、实验内容

任选一种贪心算法(Prim或Kruskal),求解最小生成树。对算法进行描述和复杂性分析。

编程实现,并给出测试实例

三、实现思想

Prim:S、V为两个集合,S中初始为{1},V中包含了所有的顶点,然后从V-S中选出和S中顶点距离最近的顶点j,并将j添加到S中。设置两个数组closest和lowcost。对于每个j属于V-S,closet[j]就是j在S中的邻接点,它于S中其他邻接点k相比较有v[j][closet[j]]<=v[j][k],其中lowcost[j]的值就是v[j][closest]。最后lowcost存储的就是相应的最小生成树的权值,而对于每个顶点,closest中可以找到最小生成树所对应的边。

四、实现代码

#include
#include
#include
#include
using namespace std;
#define mmax 100
#define maxt 100000000
int v[mmax][mmax];

void Prim(int n){
	int low[mmax];// 
	int clo[mmax];
	bool s[mmax];//判断该节点是否在S中 
	s[1]=true;
	for(int i=2;i<=n;i++){
		low[i]=v[1][i];//初始化 
		clo[i]=1;
		s[i]=false;
	}
	for(int i=1;i>n>>m;
	int ii,jj,tt;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++)
		v[i][j]=maxt;
	}
	for(int i=0;i>ii>>jj>>tt;
		v[ii][jj]=tt;
		v[jj][ii]=tt;
	}
	Prim(n);
	return 0;
}

//6 10
//1 2 6
//1 4 5
//1 3 1
//2 3 5
//2 5 3
//3 4 5
//3 5 6
//3 6 4
//4 6 2
//5 6 6

用贪心算法求解最小生成树_第1张图片

你可能感兴趣的:(蓝桥杯训练)