Kruskal模版

/*选最短边开始
  边都存入结构体中并按升序排序
  利用并查集将各点相连
  满足n-1条边,即遍历完成 
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 55
using namespace std;

int n,m,sum,cnt,cnte;   //n为点的个数  m为边的个数 
int f[maxn];

struct Edge{
	int u,v,c;
}edge[maxn*maxn];  //可能是N*N条边

bool cmp(Edge a,Edge b){
	return a.c < b.c;
}

void init(){
	cnt = cnte = 0;
	sum = 0;
	for(int i = 1; i <= n ; i++)
	    f[i] = i;
}

int getf(int x){
	return f[x] == x ? x : f[x] = getf(f[x]);
}

bool merge(int u,int v){
	int rootu = getf(u);
	int rootv = getf(v);
	if(rootu != rootv){
		f[rootv] = rootu;
		return true;
	}
	return false;
}

void Kruskal(){
	sort(edge,edge+m,cmp);
	for(int i = 0 ; i < m; i++){
		if(merge(edge[i].u,edge[i].v)){
			sum += edge[i].c;
			cnte++;
		}
		if(cnte == n-1) break;
	}
}

 

### Prim 算法模板代码 对于Prim算法,其核心思想是从任意一个节点出发构建最小生成树(MST),每次都将距离当前MST最近的一个未访问过的顶点加入到MST中。 ```python import heapq def prim(graph, start): mst = [] visited = set([start]) edges = [(cost, start, to) for to, cost in graph[start].items()] heapq.heapify(edges) while edges: cost, frm, to = heapq.heappop(edges) if to not in visited: visited.add(to) mst.append((frm, to, cost)) for next_node, c in graph[to].items(): if next_node not in visited: heapq.heappush(edges, (c, to, next_node)) return mst ``` 此段代码实现了基于优先队列优化后的Prim算法版本[^3]。 ### Kruskal 算法模板代码 Kruskal算法则采用另一种策略来寻找最小生成树。该方法首先按照边权从小到大排序所有的边,接着依次尝试将这些边添加至正在形成的森林中(初始状态下每个节点自成一棵树),如果某条边连接的是两棵不同的树,则将其作为桥梁合并这两棵树;反之若这条边两端已经连通,则跳过以免造成回路。 为了高效判断两个端点是否属于同一集合以及快速合并不同集合,在这里引入了并查集的数据结构辅助完成上述操作。 #### 并查集实现 ```python class UnionFind: def __init__(self, n): self.parent = list(range(n)) def find(self, p): if self.parent[p] != p: self.parent[p] = self.find(self.parent[p]) # 路径压缩 return self.parent[p] def union(self, p, q): rootP = self.find(p) rootQ = self.find(q) if rootP == rootQ: return False self.parent[rootP] = rootQ return True ``` #### Kruskal 主函数 ```python def kruskal(num_nodes, edges): uf = UnionFind(num_nodes) mst = [] # Sort all the edges by weight from low to high. sorted_edges = sorted(edges, key=lambda e: e[2]) for edge in sorted_edges: u, v, w = edge if uf.union(u, v): # 如果u和v不在同一个集合内就合并它们 mst.append(edge) return mst ``` 以上即为完整的Kruskal算法及其依赖的并查集工具类定义[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值