华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
代码不懂有疑问欢迎留言或私我们的VX:code5bug。
题目描述
Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。
发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。
给你一个n*n的矩阵 isConnected ,其中 isConnected[i][j]=1表示第i个发行版和第j个发行版直接关联,而 isConnected[i][j]=0表示二者不直接相连。
返回最大的发行版集中发行版的数量
输入描述
第一行输入发行版的总数量N,之后每行表示各发行版间是否直接相关
1<=N <= 200
输出描述
输出最大的发行版集中发行版的数量
示例1
输入:
4
1 1 0 0
1 1 1 0
0 1 1 0
0 0 0 1
输出:
3
题解
问题分析
我们需要找出一个最大“发行版集”的大小,定义为在给定的矩阵
isConnected
中,元素为1
的地方表示两个操作系统之间直接关联,而0
表示不直接关联。我们需要将所有直接或间接关联的操作系统归为一组,最终返回最大的关联组(即连通分量)的大小。解决这个问题时,利用 并查集(Union-Find)来处理集合的合并与查询是非常高效的。这里我们不使用秩(rank)优化,仅使用基本的路径压缩和合并操作。
并查集算法步骤
- 初始化:每个操作系统自成一个集合。
- Union:当
isConnected[i][j] = 1
时,将操作系统i
和j
合并为一个集合。- Find:查找一个操作系统所在的集合的根节点。
- 计算:每次合并后,统计每个集合的大小,最终返回最大的集合大小。
JavaScript
const rl = require("readline").createInterface({
input: process.stdin,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
class UnionFind {
constructor(n) {
this.parent = Array.from({ length: n }, (_, i) => i);
this.size = Array(n).fill(1);
}
find(x) {
if (this.parent[x] !== x) {
this.parent[x] = this.find(this.parent[x]); // 路径压缩
}
return this.parent[x];
}
union(x, y) {
const rootX = this.find(x);
const rootY = this.find(y);
if (rootX !== rootY) {
this.parent[rootX] = rootY; // 合并
this.size[rootY] += this.size[rootX]; // 更新集合大小
}
}
getSize(x) {
return this.size[this.find(x)];
}
}
void (async function () {
const isConnected = [];
const n = parseInt(await readline());
for (let i = 0; i < n; i++) {
isConnected.push((await readline()).split(" ").map(Number));
}
const uf = new UnionFind(n);
// 合并操作
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
if (isConnected[i][j] === 1) {
uf.union(i, j);
}
}
}
// 查找最大的集
let max = 0;
for (let i = 0; i < n; i++) {
max = Math.max(max, uf.getSize(i));
}
console.log(max); // 输出结果
rl.close();
})();
结论
通过并查集,我们可以高效地处理多个元素之间的关系合并与查询问题。所有的并查集操作,尤其是路径压缩,确保了在处理大量数据时的高效性。本问题的解决使用了基本的路径压缩技术而没有使用秩(rank)优化,但仍能在合理的时间内得到答案。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏