作业1 ———Prim和Kruskal算法求最小生成树

本文详细介绍了Prim和Kruskal算法在构造最小生成树过程中的原理和实现,包括Prim算法从一个起始点逐步选择权值最小的边,以及Kruskal算法通过遍历边集寻找最小权值边并避免形成环。同时,文章还讨论了两种算法的时间复杂度和空间复杂度,Prim为O(n^3),Kruskal为O(n^2)。
摘要由CSDN通过智能技术生成

1问题

Prim算法和Kruskal算法构造最小生成树的过程和算法实现
2解析

Prim:在一个加权连通图中,选取一个起始点,在所有相邻点中选取一个权值最小的点与起始点构成点集,在不形成环的情况下重复上述操作,使所有点进入该点集,形成Prim最小生成树。
在这里插入图片描述
Kruskal:在一个加权连通图中,Graph[v]是该图的加权边集,循环:从该集合中最小的权值边开始遍历,直到每个顶点都在同一连通分量中(if 一条边的两个顶点不在同一连通分量中,就添加该边到E[new]中),E[new]以边集的形式输出Kruskal法最小生成树。
在这里插入图片描述

3设计

Int Prime(int start){
Visit[start]=1;
For(i from 1 to vmax){
For(j from 1 to vmax)
Visit[i]=0;
Dist[i][j]=graph[i][j];
( * Dist[i][i]=INF)
}
While[visitnum<Vnum]{
For(i from1 to Vmax){
For(j from 1 to Vmax){
If(visit[i]==true && visit[j]==false && Graph[i][j]<dist)
更新 dist[i][j] 和 pos[i] pos[j];
}
}
Visit[pos[j]]=true;
Visitnum++;
Path+=dist[i][i];
Mp[][]记录distp[i][j];
}
}

bool is-same-set(){}判断两个点是否为同一连通分量
int set(){}查询根节点
void merge_in_same_set(){}将两个点归为同一连通分量
int Kruskal(){
判断结构体数组中 i 和 j是否在同一连通分量,是的话不加入sum,不是的话加入
}

4分析

Prim:
While{
For(){
For(){
}
}
}
时间复杂度O(n^3) 空间复杂度O(1)
Kruskal:
时间复杂度:O(n^2) 空间复杂度O(1)
5源码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define v 4
int set[v];
int mp[v][v] = {
    0 };
int Graph[v][v];
bool visit[v] = {
   false};
struct road {
   
	int i;
	int j;
	int w;
}r[4];
void  Prim(int Graph[]
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Prim算法Kruskal算法都是最小生成树的经典算法Prim算法是一种贪心算法,从一个起点开始,每次选择与当前生成树相邻的最小边,将其加入生成树中,直到生成树包含所有节点为止。 Kruskal算法也是一种贪心算法,将所有边按照权值从小到大排序,依次加入生成树中,如果加入该边不会形成环,则加入生成树中,直到生成树包含所有节点为止。 两种算法的时间复杂度都为O(ElogE),其中E为边数。但是Prim算法更适合稠密图,Kruskal算法更适合稀疏图。 ### 回答2: Prim算法Kruskal算法都是解无向连通图的最小生成树的经典算法。它们的本质思想相似,都是通过贪心策略,逐步加入边,生成具有最小总权值的生成树。 Prim算法基于节点集合的思想。从一个任意节点开始,逐步加入与之距离最小的未被访问的节点,直到包含所有节点为止。把已经加入生成树的节点称为已访问节点,把还没加入的节点称为未访问节点。在每一步中,从已访问节点中选取距离最小的节点,并把它加入生成树,把它未被访问的邻居加入未访问节点集合。重复这个过程直到所有节点都被访问过。Prim算法的时间复杂度为O(n^2),如果采用优先队列优化,可以降至O(nlogn)。 Kruskal算法基于边集合的思想。把所有的边按照权值从小到大排序,逐步加入边,直到包含所有节点为止,并保证不会形成环。在每一步中,从未加入生成树的边中取出权值最小的边,如果这条边连接的两个节点不在同一个连通分量中,则把这条边加入生成树,并把节点所在的连通分量合并。重复这个过程直到所有节点被合并为一个连通分量。Kruskal算法的时间复杂度为O(mlogm),其中m为边数。 两种算法都具有计算简单,时间复杂度低的特点,但是具体选择哪种算法还需要根据具体问题的特点进行考虑。如果图是密集图,采用Prim算法更高效;如果图是稀疏图,采用Kruskal算法更具优势。 ### 回答3: prim算法kruskal算法最小生成树的常用算法之一,它们的实现思路不同,但结果相同,都能够得到一个最小的生成树。 首先,我们来介绍prim算法prim算法是一种贪心算法,它从一个顶点开始,逐步选取与当前最小生成树相连的一条最小边,直到所有顶点都被访问过,形成一个最小生成树算法的实现可以用一个小根堆来存储当前未加入最小生成树的边,每次选择堆顶元素(即当前最小的边),将其加入生成树中,同时更新堆中元素。由于prim算法每次只选择一条边,因此它的时间复杂度为O(ElogV),其中E为边的数量,V为顶点的数量。 其次,我们来介绍kruskal算法kruskal算法是一种基于边的贪心算法,它按照边权值从小到大选取边,并判断该边是否会形成环,如果不会则加入生成树中,直到添加的边数等于顶点数减一或者无法再添加新的边为止。算法的实现可以用一个并查集来保存顶点之间的关系,每次加入一条新边时,判断该边两端点是否在同一集合中,如果不在,则将它们合并到同一个集合中,并将该边加入生成树中。由于kruskal算法需要对所有边进行排序,因此时间复杂度为O(ElogE),其中E为边的数量。 在应用中,prim算法适用于稠密图,因为它只需要遍历与当前已加入的点相邻的点,并找到一个与当前最小生成树相连的最小边;而kruskal算法适用于稀疏图,因为它只需要遍历所有边,并通过并查集判断是否形成环,可以处理相对较大的边数。 总之,prim算法kruskal算法都是最小生成树的有效算法,具体实现中应根据图的特点选择最优算法来解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值