leetcode_10:并查集

并查集

维基百科中的定义:在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个用于此数据结构的操作:

  • Find: 确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集
  • Union: 将两个子集合并成同一个集合

为每个集合选定一个固定的元素,称为代表,以表示整个集合。并查集是树型结构,那么可选根节点作为代表。Find(x)返回x所属集合的代表,而Union使用两个集合的代表作为参数。
定义数组present,记录每个元素的根节点。
find函数,用于查找x的根节点。

int find(int x){
    int r = x;
    while(present[r]!=r) r = pre[r]; // 返回根节点
    // 路径压缩
    int i=x;
    while(i!=r){
        int j = pre[i];
        pre[i]=r;
        i = j;
    }
    return r;
}
// 简化程序,使用递归,find函数如下
int find(int x){
    if(x!=present[x]){
        present[x] =find(present[x]);
    }
    return present[x];
}
void join(int x, int y){
    int fx = find(x);
    int fy = find(y);
    if(fx!=fy){
        pre[fx] = fy; // 如果fx和fy不等,就说明不在同一集合,把它们所在的集合合并起来。
    }
}

冗余连接

在本问题中, 树指的是一个连通且无环的无向图。

输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。

结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。

返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。

思路: 使用并查集思想,如果两个点的根节点相同,说明是冗余边,不然的话,就将两个分支联合起来

class Solution {
public:
    int find(int x, vector& present){
        int r = x;
        while(r!=present[r]){
            r = present[r];
        }
        int i = x;
        while(i!=r){
            int j = present[i];
            present[i] = r;
            i = j;
        }
        return r;
    }
    vector findRedundantConnection(vector>& edges) {
        int row = edges.size();
        vector present(row+1, 0);
        vector res(2, 0);
        for(int i=1;i<=row;i++) present[i] = i;
        for(int i=0;i

连通网络的操作次数

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。

网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。

给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。

思路: 使用并查集查看网络连接的集合数,首先n台机器至少需要n-1个线进行连接,如果给出来的连线少于n-1,那么则不可能,否则的话,则是集合数目减一。

class Solution {
public:
    int find(int x, vector & present){
        if(x!=present[x]){
            present[x] = find(present[x], present);
        }
        return present[x];
    }
    int makeConnected(int n, vector>& connections) {
        vector present(n, 0);
        for(int i=0;i=(n-1)) return m-1;
        return -1;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/redundant-connection
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode_10:并查集)