在M个人里面包含有N个朋友关系R,如果朋友的朋友也属于同一个朋友圈,那么设计程序计算共有多少个朋友圈?
思路:使用并查集,开始时候将M个元素的数组初始化成-1,当加入元素的时候,如果元素的位置上面的数据不是负数,那么就将该数据作为下标继续寻找下标为负数的位置,如果找到了下标为负数的位置就将需要关联的数据的数据加到寻找到的位置上面。
如图,将具有直接朋友关系的看成一棵树,那么并查集里面的负数的个数就是森林里面的树的个数。
在并查集里面主要的两个函数是find和join、find用于寻找对应数据的根节点,join函数用于将制定的数据和现有的数据进行关联。
class unionset{
public:
unionset(size_t size)
{
_un.resize(size,-1);
}
void Display(){
for(int i=0;i<_un.size();i++)
cout<<_un[i]<<" ";
}
int find(int x){
while(_un[x] > 0){
x = _un[x];
}
return x;
}
void join(int x,int y){
int ix = find(x);
int iy = find(y);
if(ix == iy)
return ;
else{
_un[ix] += _un[iy];
_un[iy] = ix;
}
}
private:
vector<int> _un;
};
测试数据:
int main(){
unionset un(10);
un.join(0,8);
un.join(1,2);
un.join(2,3);
un.join(3,7);
un.join(4,5);
un.join(5,6);
un.join(8,9);
un.Display();
return 0;
}