算法分析与设计实践-作业1-1-Prime构造最小生成树

Prime算法构造最小生成树

1.问题

给定一张边带权的无向图G = (V,E) , n =|V| , m = |E| 。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最小生成树。

2.解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.设计

void prime(){
    
    
	memset(d,0x3f,sizeof(d));//初始化d数组,默认为无穷大 
	memset(v,0,sizeof(v));//初始化v数组为0,即所有点未被连通 
	d[1]=0;//特定从点1开始形成最小生成树 
	for(i form 1 to n-1){
    
    
		x=0;
		for(j form 1 to n){
    
    
			if(!v[j]&&(x==0||d[j]<d[x])){
    
    
				x=j;
			}
			//点未被连通且找到最小权值边,记为x 
		}
		v[x]=1;//标记点已经走过 
		for(y form 1 to n){
    
     
			if(!v[y])d[y]=min(d[y],a[x][y]);
			//如果该点未连通,则更新d数组
		}
	}
	for(i form 2 to n){
    
    //权值相加 
		ans+=d[i];
	}
}

4.分析

时间复杂度分析:设n个顶点,m条边。

  1. 对集合中的每一个顶点的d数组和v数组进行初始化操作:O(n)
  2. 加点、寻找最小权值边,同时更新d数组:O(n^2)
  3. 各点权值相加:O(n)

综上所诉,Prime算法的时间复杂度为O(n^2)。

5.源码

https://github.com/lu-225/As-before/blob/master/2018212212124%20%E9%99%86%E5%AE%B6%E8%BE%89%20%E5%AE%9E%E9%AA%8C1-1/Prime.cpp

猜你喜欢

转载自blog.csdn.net/qq_43633353/article/details/104619696