算法分析与设计丨第九周丨LeetCode(13)——Redundant Connection(Medium)

来源:互联网 发布:网络灰色收入路子 编辑:程序博客网 时间:2024/06/06 02:36

并查集算法

题目链接:https://leetcode.com/problems/redundant-connection/description/

题目描述:

In this problem, a tree is an undirected graph that is connected and has no cycles.

The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, ..., N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed.

The resulting graph is given as a 2D-array of edges. Each element of edges is a pair [u, v] with u < v, that represents an undirected edge connecting nodes u and v.

Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge [u, v] should be in the same format, with u < v.

Example 1:

Input: [[1,2], [1,3], [2,3]]Output: [2,3]Explanation: The given undirected graph will be like this:  1 / \2 - 3

Example 2:

Input: [[1,2], [2,3], [3,4], [1,4], [1,5]]Output: [1,4]Explanation: The given undirected graph will be like this:5 - 1 - 2    |   |    4 - 3

Note:

  • The size of the input 2D-array will be between 3 and 1000.
  • Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array.


    题目解析:这题也容易看出用并查集算法来做,但是速度并不算快,或许有更好的算法。做法其实和经典的并查集算法一致。


    class Solution {public:    int find(int x,vector<int>& father)    {        while(x!=father[x])            x = father[x];        return x;    }        vector<int> findRedundantConnection(vector<vector<int>>& edges) {        int size = edges.size();        vector<int> father(size+1);        vector<int> rank(size+1);                for(int i = 1;i<=size;++i)        {            father[i] = i;            rank[i] = 0;        }                vector<int> result;                for(int i = 0;i<size;++i)        {                        int father_1 = find(edges[i][0],father);            int father_2 = find(edges[i][1],father);                        if(father_1 == father_2)            {                result.push_back(edges[i][0]);                result.push_back(edges[i][1]);                continue;            }            else            {                if(rank[father_1] > rank[father_2])                {                    father[father_2] = father_1;                   }                else                {                    if(rank[father_1] == rank[father_2])                        rank[father_2]++;                    father[father_1] = father_2;                                }                                                            }                                            }        return result;            }};





  • 阅读全文
    0 0
    原创粉丝点击