并查集

1.通俗易懂,适合初学者。
http://blog.****.net/dellaserss/article/details/7724401
2.讲解详细,有更多思考。
http://blog.****.net/dm_vincent/article/details/7655764

struct DisjointSet{
    vector<int> father,rank;
    DisjointSet(int n):father(n),rank(n){
        for(int i=0; i<n; ++i)
            father[i]=i;
    }
    int find(int v){
        return father[v]=father[v]==v?v:find(father[v]);
    }
    void merge(int x,int y){
        int a=find(x),b=find(y);
        if(rank[a]<rank[b])
            father[a]=b;
        else{
            father[b]=a;
            if(rank[b]==rank[a])
                ++rank[a];
        }
    }
};

并查集
并查集