LeetCode 684. Redundant Connection

知识点

并查集

结果

在这里插入图片描述

实现

码前思考

  1. 在草稿纸上模拟加边的过程,发现当对同一棵树上的两个节点加边时,这条边就是答案要求的冗余边。因此,应该要解题的核心就是判断两个顶点是否在一棵树中,很容易想到并查集

代码

//无向图
//编号从1开始!
//结点的个数最多是1000
//其实可以看作是树的合并,最开始每个节点相当于是一棵树
//因此可以使用并查集?
class Solution {

private:
    //最大的结点数
    const static int maxv = 1010;
    //父亲数组
    int father[maxv];
public:
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        //初始化父亲数组
        for(int i=0;i<maxv;i++){
            father[i] = i;
        }

        //边的两个端点
        int u;
        int v;

        //开始读入我们的边
        for(auto edge : edges){
            u = edge[0];
            v = edge[1];

            int faU = findFather(u);
            int faV = findFather(v);

            if(faU == faV){ //如果两者父亲相等,说明两者在同一棵树中
                break;
            }else{
                father[faU] = faV;
            }
        }

        vector<int> ans;
        ans.push_back(u);
        ans.push_back(v);

        return ans;
    }

    int findFather(int x){
        if(x == father[x]){
            return x;
        }
        int tmp = findFather(father[x]);
        father[x] = tmp;
        return tmp;
    }
};

码后反思

  1. 一棵树有 N N 个节点,那么它只能有 N 1 N-1 条边;
  2. 这道题继续加深了我对并查集的理解。
发布了138 篇原创文章 · 获赞 3 · 访问量 3826

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105034101