leetcode 684. Redundant Connection

We are given a "tree" in the form of a 2D-array, with distinct values for each node.

In the given 2D-array, each element pair [u, v] represents that v is a child of u in the tree.

We can remove exactly one redundant pair in this "tree" to make the result a tree.

You need to find and output such a pair. If there are multiple answers for this question, output the one appearing last in the 2D-array. There is always at least one answer.

Example 1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: Original tree will be like this:
  1
 / 
2 - 3
Example 2:
Input: [[1,2], [1,3], [3,1]]
Output: [3,1]
Explanation: Original tree will be like this:
  1
 / \
2   3
Note:
The size of the input 2D-array will be between 1 and 1000.
Every integer represented in the 2D-array will be between 1 and 2000.

并查集,判断一下就好了 (比如线段[a,b],如果a在集合中,b也在集合中那么这条边就要删除)

class Solution {
public:
    int fa[1100];
    void init() {
        for (int i = 0; i < 1001; ++i) fa[i] = i;
    }
    int findfa(int x) {
        if (x == fa[x]) return x;
        return fa[x] = findfa(fa[x]);
    }
    int Union(int a, int b) {
        int x = findfa(a);
        int y = findfa(b);
        if (x == y) return 1;
        if (x < y) fa[y] = x;
        else fa[x] = y;
        return 0;
    }
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        init();
        vector<int>v;
        for (int i = 0; i < edges.size(); ++i) {
            int a = edges[i][0];
            int b = edges[i][1];
            if (Union(a, b)) {
                v.push_back(a);
                v.push_back(b);
            }
        }
        return v;
    }
};

You are here!
Your runtime beats 100.00 % of cpp submissions. 哈哈

原文地址:https://www.cnblogs.com/pk28/p/7589396.html