算法分析与设计实践(作业一):Prim算法与Kruskal算法构造最小生成树

Prim算法与Kruskal算法构造最小生成树

1. 问题

(1)举一个实例,画出采用Prim算法构造最小生成树的过程。
(2)举一个实例,画出采用Kruskal算法构造最小生成树的过程

2. 解析

在这里插入图片描述

Prim 算法
  1. 构造函数init( ),先初始化数组、变量,用二维数组dis[N][N]来存储边的权值,一维数组vis[N]标记已放入最小生成树的顶点。输入点和权值。
  2. 构造prim( )函数来遍历寻找,寻找已加入最小生成树中的顶点au[]相邻的权值最小的边,并将边的另一顶点存入v,标记该点已被放入,累加最短路径长度,并输出放入最小生成树中的两顶点。
  3. 当循环次数等于输入的顶点个数减一时,程序结束,最短路径找到。
Kruskal算法
  1. 用结构题存储点和权值。
  2. 构造函数,先初始化函数,初始化并查集(自己是自己的父亲)。
  3. 构造函数kruskal(),先对权值进行从小到大排序,如果两点父亲不同,则将两点相连,边数加一。
  4. 如果边数比总的点数少一,说明所有点相连,最短路径找到。

3.设计

Prim 算法
void prim(){
	vis[1] = 1标记顶点1;
	for(遍历与顶点1相邻的点){
		a[i]=dis[1][i]存入和1相邻的点;
		au[i]=1记录边一边的顶点编号; 
	}
		for(顶点相连后的边数,顶点数减一){
		int minn=INF给最小值变量赋一个较大的值;
		for(遍历所有顶点j){
			if(该点未加入最短路径(未标记),并且a[j]<minn E(au[j],j)的权值比最小值小){
				minn = a[j] 更改最小值;
				v = j 记录顶点;
				u = au[j];
			}
		}
		vis[v] = 1标记顶点v;
        输出边E(au[j],j);
		ans += minn 记录最短路径;
		for(遍历所有顶点j){
			if(该点未加入最短路径(未标记),并且a[j]>dis[v][j] E(au[j],j)的权值比现有到点j的值小){ 
				a[j] = dis[v][j] 记录到点j的值(边值);
				au[j]=v 记录E(au[j],j)一端顶点; 
			}
		}
	}
}
Kruskal算法
void kruskal(){
	sort(结构体a中 对权值w进行从小到大排序);
	
	for(对结构体a进行遍历){
		if(边数为点的个数减一) 结束循环;
		if(并查集中E(u,e)的父亲不同){E(u,e)加入并查集; 
			输出E(u,e)相连的点;
			加上边E(u,e)的值求最短路径的值;
			边数加一; 
		}	
	}
	输出最短路径的值;
}

4.分析

Prim 算法:

时间复杂度:O(n^2)

Kruskal算法:

时间复杂度: O(mlogm)

5.源码

代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值