最小生成树+并查集: 找到最小生成树的关键边和伪关键边

这篇博客探讨了如何在带权无向连通图中找到最小生成树的关键边和伪关键边。通过Kruskal和Prim算法的详细解释,帮助读者理解如何判断边在最小生成树中的重要性。文章包含题目描述、算法理解及两种解法的详细介绍。
摘要由CSDN通过智能技术生成

一、题目描述

找到最小生成树里的关键边和伪关键边。

给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。请你找到给定图中最小生成树的所有关键边和伪关键边。

如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可
能会出现在某些最小生成树中但不会出现在所有最小生成树中的边。

请注意,你可以分别以任意顺序返回关键边的下标和伪关键边的下标。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、理解题意

在这里插入图片描述

三、解法一:Kruskal算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

private int[] parent;
private int[][] edgesCopy;

public void init(int n) {
   
	if (parent == null)
		parent = new int[n]; 
	for (int i = 0; i < n; ++i) {
   
		parent[i] = i; 
	}
}

public int find(int i) {
   
	while (parent[i] != i) {
   
		i = parent[i];
		parent[i] = parent[parent[i]];
	}
	return parent[i];
}

public boolean union(int x, int y) {
   
	int rootX = find(x);
	int rootY = find(y);
	if (rootX != rootY) {
    
		parent[rootX] = rootY;
		return true;
	}
	return false;
}

public int kruskal(int[][] edges, int n, int index, boolean giveOrTake) {
   
	// 初始化并查集
	init(n);
	
	/* 伪关键边处理 */
	int mstWeightSum = 0, mstEdgeCount = 0;
	if (!giveOrTa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值