并查集实现

来源:互联网 发布:杭州淘宝tnt摄影基地 编辑:程序博客网 时间:2024/05/21 08:24
当集合a= {1,2,3} ,b ={3,5}, c= {7,8}, d ={9,10,5} 存在时候,若要生成若干个不想交的集合,是这集合的合集。这时候用到并查集。最重要的应用就是朋友圈的划定,或者求连通图。 如结果:{1,2,3,5,9,10},{7,8};
 
 
#include <iostream>#include <vector>#include <map>#include <list>#include <algorithm>#include <assert.h>using namespace std;template <class T>int Father_Set(T  x , map<T,T> & father_map){if(father_map.find(x) != father_map.end()){map<T,T>::iterator iter = father_map.find(x);if (x != iter->second){father_map[x] = Father_Set(iter->second, father_map);}return iter->second;}    assert("element is exsiting...");return 0;}template <class T>vector<vector<T>> Union_Set(vector<vector<T>> & sets){map<T,T> father_map;vector<vector<T>>::iterator iter_vec;// init...iter_vec = sets.begin();while(iter_vec != sets.end()){for (vector<int>::iterator iter = iter_vec->begin(); iter != iter_vec->end(); iter++){if(father_map.find(*iter) != father_map.end())continue;elsefather_map.insert(make_pair(*iter,*iter));}iter_vec++;}    // set father;iter_vec = sets.begin();while(iter_vec != sets.end()){for (vector<T>::iterator iter = iter_vec->begin() ; iter != iter_vec->end(); iter++){if ((iter + 1) !=  iter_vec->end()){T father1 = Father_Set(*iter,father_map);T father2 = Father_Set(*(iter+1), father_map);    father_map[father1] = father2;}}iter_vec++;}map<T,T>::iterator m_iter = father_map.begin();map<T, vector<T>> unique_sets;while(m_iter != father_map.end()){int father = Father_Set(m_iter->first,father_map);if (unique_sets.find(father) != unique_sets.end()){unique_sets[father].push_back(m_iter->first);}else{vector<T> a;a.push_back(m_iter->first);unique_sets.insert(make_pair(father,a));}m_iter++;}vector<vector<int>> usets;for(map<T,vector<T>>::iterator iter = unique_sets.begin(); iter != unique_sets.end(); iter++){vector<int> sv = iter->second;usets.push_back(sv);}return usets;}