最小生成树及其求解算法

最小生成树

图论中,树是图的一种特殊形式,它的众多性质中有两个是求解最小生成树的Prim算法和Kruskal算法的基础:

(1)用一条边连接树中的任意两个顶点都会产生一个新的环;

(2)从树中删去一条边将会得到两棵独立的树。

无权图中的边只是单纯的作为联系两个顶点的抽象概念,而带权图(也称加权图)中为边增加了权重,使得顶点之间的路径形式变得更丰富多样。图的生成树是它的一棵含有其所有顶点的无环连通子图,而带权图的最小生成树(Minimun Spanning Tree,MST)是指生成树中所有边的权值之和最小的生成树。

定义加权无向图的结构如下:

//加权图
struct EdgeWeightedGraph
{
	size_t V; //顶点数
	size_t E; //边数
	map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集
}

由于我们用STL的tuple作为边的存储容器,而tuple的比较操作不符合我们的要求,所以我们得自己定义一个比较操作:


                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最小生成树是一种在加权无向图中生成树的算法,它的目标是找到连接所有节点的最小总重的树。下面是Prim算法算法分析: 1. 算法思路: - 从一个任意节点开始,将其加入生成树中。 - 找到与生成树相邻的边中重最小的边,将其连接的节点加入生成树中。 - 重复上一步,直到所有节点都被加入生成树中。 2. 算法实现: - 使用一个数组记录每个节点是否已经被加入生成树中。 - 使用一个数组记录每个节点与生成树相邻的边中重最小的边。 - 使用一个优先队列(最小堆)记录所有与生成树相邻的边,按照重从小到大排序。 - 从任意节点开始,将其加入生成树中,并将其与生成树相邻的边加入优先队列中。 - 从优先队列中取出重最小的边,将其连接的节点加入生成树中,并将其与生成树相邻的边加入优先队列中。 - 重复上一步,直到所有节点都被加入生成树中。 3. 时间复杂度: - Prim算法的时间复杂度为O(ElogV),其中E为边数,V为节点数。 以下是Python实现Prim算法的代码: ```python import heapq def prim(graph): n = len(graph) visited = [False] * n min_edges = [float('inf')] * n min_edges[0] = 0 pq = [(0, 0)] total_weight = 0 while pq: weight, u = heapq.heappop(pq) if visited[u]: continue visited[u] = True total_weight += weight for v, w in graph[u]: if not visited[v] and w < min_edges[v]: min_edges[v] = w heapq.heappush(pq, (w, v)) if all(visited): return total_weight else: return "impossible" ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值