0
点赞
收藏
分享

微信扫一扫

<算法与数据结构>详解贪心策略之最小生成树的Prime算法的设计与实现

🎉情人节快乐!

🎉 没有对象就搁这儿好好学习,有对象了就为了对象好好学习

🎉写在前面

最小生成树的问题还是比较热门的,最经典的莫过于Prime算法和Kruskal算法了,这篇博文我会详细讲解Prime算法的设计思想与具体代码的实现,不要求数据结构学的有多好,只要跟着我的思路来,一步一步的分析,调试,终能成就自己,那就让我们开始吧!


🎉目录

浅析最小生成树

Prime算法思想

此算法核心部分

结构体的选择

实现思路

构造实例

构造过程 

代码详解

调试结果

总结 


浅析最小生成树

Prime算法思想

牵扯到贪心策略

此算法核心部分

结构体的选择

实现思路

tips:onTreet 属性是布尔类型,为true时该结点在“树”上

构造实例

构造过程 

代码详解

#include <iostream>
using namespace std;
struct Node {
	int ID;//结点序号
	bool OnTree;//是否属于最小生成树
};
struct LS {
	int N1, N2; int V; bool OnTree;//OnTree用于判断此边是否在“树”上
	LS(int n1, int n2, int v) {
		N1 = n1; N2 = n2; V = v; OnTree = false;//N1,N2为边左右连接点,v是边的权值
	}
};
Node A[] = { {1,false}, {2,false}, {3,false}, {4,false}, {5,false} };//点结构体数组
LS L[8] = { LS(1,2,1),LS(1,3,4) ,LS(2,3,2),
LS(2,5,2),LS(4,5,4),LS(3,4,6),LS(3,5,3),LS(1,4,8)};//边结构体数组
bool FindOne(LS L ,Node A[]) {//布尔类型
	int m = 0;
	for (int i = 0; i < 5; i++)
		if (L.N1 == A[i].ID && A[i].OnTree) m++;
	for (int i = 0; i < 5; i++)
		if (L.N2 == A[i].ID && A[i].OnTree) m++;
	return m ==1;//只有N1和N2的一个连接到了在“树”上的结点才为真
}

int main()
{
	A[0].OnTree = true;
	for (int i = 0; i < 5; i++) {
		int p = 0;
		for (int j = 0; j < 8; j++) {
			if (FindOne(L[j], A)) {
				p = j; break;
			}
		}
		for (int i = 0; i < 8; i++) {
			if (FindOne(L[i], A))
				if (L[i].V < L[p].V) p = i;
		}
		L[p].OnTree = true;//选中的边设置为在“树”上
        //将边的连接点放在“树”上
		for (int i = 0; i < 5; i++) {
			if (L[p].N1 == A[i].ID) A[i].OnTree = true;
			if (L[p].N2 == A[i].ID) A[i].OnTree = true;
		}
	}
    //输出最小生成树所有边
	for (int i = 0; i < 8; i++) {
		cout << L[i].OnTree;
	}
}

这里详细的解析一下FindOne函数:

bool FindOne(LS L ,Node A[]) {//布尔类型
	int m = 0;
	for (int i = 0; i < 5; i++)
		if (L.N1 == A[i].ID && A[i].OnTree) m++;
	for (int i = 0; i < 5; i++)
		if (L.N2 == A[i].ID && A[i].OnTree) m++;
	return m ==1;//只有N1和N2的一个连接到了在“树”上的结点才为真
}
调用方法 : FindOne(L[j], A)

调用该函数的时候,实参第一个是边结构体类型的L数组内的任意一个元素,第二个则是点结构体类型的A数组的首地址,所以形参第一个需要传入LS类型的变量L,第二个则是整个Node类型的数组,这样传参才相互对应,如果对于函数传参有疑问,可以参考这篇博文🎉详解函数的传参方式🎉然后定义变量m初始值为0,第一个for循环是和该边的第一个连接点作比较,满足条件则m+1;第二个for循环是和该边第二个连接点作比较,满足条件也会加m也会加1;但是我只要比较结果为一的m,这样就能筛选出满足条件的边。

调试结果

总结 

Prime算法属于贪心算法的一种,尽情的找到权值最小的边并连接到一起,最小生成树的算法分享与实现圆满完成了,希望对大家有实质性的帮助,期待你们的支持,下篇文章再见吧!

举报

相关推荐

0 条评论