普里姆算法,克鲁斯卡尔算法

这两种算法都是得出最小生成树的算法,只不过方法不同

普里姆是归并点

而克鲁斯卡尔是归并边


先说普里姆算法

先随意选一个点加入归并点数组之中,然后选出与这个点关联的最小的权的点,输出,并把那个点也加入归并点数组之中,然后再从每一次都从归并点数组之中选一个点道不在这个数组之中的点的最小的权值,再把这个点也加入归并点数组,知道所有的点都在归并点数组之中


•1. 从某顶点 u0 出发,选择与它关联的具有最小权值的边(u0,v),将其顶点加入到生成树的顶点集合U
•2. 每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把顶点v加入到U
•3. 直到所有顶点都加入到生成树顶点集合U中为止

aaa


克鲁斯卡尔算法

每次选能让连通分量减一的点的最短的权


•1. 构造一个只有 n 个顶点,没有边的非连通图 T = { V, Æ }, 每个顶点自成一个连通分量
•2. 在 E 中选最小权值的边,若该边的两个顶点落在不同的连通分量上,则加入 T 中;否则舍去,重新选择
•3. 重复下去,直到所有顶点在同一连通分量上为止

aa





  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
普里姆算法克鲁斯卡尔算法都是求解最小生成树的经典算法普里姆算法的基本思想是从一个点开始,每次选择一个与当前生成树距离最近的点加入生成树中,直到所有点都被加入生成树为止。具体实现时,可以使用一个优先队列来维护当前生成树与未加入生成树的点之间的距离,每次从队列中取出距离最小的点加入生成树中,并更新队列中其他点的距离。 以下是普里姆算法的Python实现: ```python import heapq def prim(graph): n = len(graph) visited = [False] * n dist = [float('inf')] * n dist[0] = 0 pq = [(0, 0)] mst = [] while pq: d, u = heapq.heappop(pq) if visited[u]: continue visited[u] = True mst.append(u) for v, w in graph[u]: if not visited[v] and w < dist[v]: dist[v] = w heapq.heappush(pq, (w, v)) return mst ``` 克鲁斯卡尔算法的基本思想是从所有边中选择权值最小的边加入生成树中,直到生成树中包含所有点为止。具体实现时,可以使用并查集来维护当前生成树中的连通性,每次从所有边中选择权值最小的边,如果这条边连接的两个点不在同一个连通块中,则将这条边加入生成树中。 以下是克鲁斯卡尔算法的Python实现: ```python def kruskal(graph): n = len(graph) parent = list(range(n)) rank = [0] * n edges = [] for u in range(n): for v, w in graph[u]: edges.append((w, u, v)) edges.sort() mst = [] for w, u, v in edges: pu, pv = find(parent, u), find(parent, v) if pu != pv: mst.append((u, v, w)) union(parent, rank, pu, pv) return mst def find(parent, u): if parent[u] != u: parent[u] = find(parent, parent[u]) return parent[u] def union(parent, rank, pu, pv): if rank[pu] > rank[pv]: parent[pv] = pu elif rank[pu] < rank[pv]: parent[pu] = pv else: parent[pu] = pv rank[pv] += 1 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值