[LintCode][Union Find] Find the

作者: 楷书 | 来源:发表于2016-04-15 13:17 被阅读164次

    Problem

    Find the number Weak Connected Component in the directed graph. Each node in the graph contains a label and a list of its neighbors. (a connected set of a directed graph is a subgraph in which any two vertices are connected by direct edge path.)

    Notice

    Sort the element in the set in increasing order
    

    Example

    Given graph:

    A----->B  C
     \     |  | 
      \    |  |
       \   |  |
        \  v  v
         ->D  E <- F
    

    Return {A,B,D}, {C,E,F}. Since there are two connected component which are {A,B,D} and {C,E,F}

    Solution

    并查集

    /**
     * Definition for Directed graph.
     * struct DirectedGraphNode {
     *     int label;
     *     vector<DirectedGraphNode *> neighbors;
     *     DirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    private:
        map<int, int> father;
    public:
        /**
         * @param nodes a array of directed graph node
         * @return a connected set of a directed graph
         */
        vector<vector<int>> connectedSet2(vector<DirectedGraphNode*>& nodes) {
            for(int i = 0; i < nodes.size(); i++) {
                int label = nodes[i]->label;
                if (father.count(label) == 0) {
                    father[label] = label;
                }
                
                for(int j = 0; j < nodes[i]->neighbors.size(); j++) {
                    int neLabel = nodes[i]->neighbors[j]->label;
                    father[findFather(neLabel)] = findFather(label);
                }
            }
            
            map<int, vector<int>> v;
            for(int i = 0; i < nodes.size(); i++) {
                int label = nodes[i]->label;
                v[findFather(label)].push_back(label);
            }
            
            vector<vector<int>> ret;
            for(map<int, vector<int>>::iterator iter = v.begin(); iter != v.end(); iter++) {
                ret.push_back(iter->second);
            }
            
            return ret;
        }
        
        int findFather(int label) {
            int startLabel = label;
            
            if (father.count(label) == 0) {
                father[label] = label;
                return label;
            }
            
            while (father[label] != label) {
                label = father[label];
            }
            
            while (father[startLabel] != startLabel) {
                int nextLabel = father[startLabel];
                father[startLabel] = label;
                startLabel = nextLabel;
            }
            
            return label;
        }
    };
    

    相关文章

      网友评论

        本文标题:[LintCode][Union Find] Find the

        本文链接:https://www.haomeiwen.com/subject/ygrnlttx.html