并查集
问题:说白了就是 领导 的领导 还是领导
假设有一个数组 Leader[1000],代表着某个世界里有 1000 个人
而在这个世界上每个人只有一个Leader,并且在数组的值中记录着
比如 Leader[15] = 58
意味着 id = 15 的人,他的 leader 是 id = 58 的那个
如果 Leader[66] = 66
意味着 id = 66 的这个人是某家公司得到最高总裁
如何按照不同公司将这些人分开呢?只能依靠总裁了
int unionsearch(int root) //输入某人 id,返回总裁 id
{
int son, tmp;
son = root;
while(root != pre[root]) //直到找到总裁,return
root = pre[root];
return root;
}
但是每次查找都要费了九牛二虎之力,那么就在每次查找时候将leader的leader也换成总裁吧,即路径压缩
int unionsearch(int root) //输入某人 id,返回总裁 id
{
int son, tmp;
son = root;
while(root != pre[root]) //找到了总裁
root = pre[root];
while(son != root) //把这一路上问过的leader的领导都改成总裁
{
tmp = pre[son];
pre[son] = root;
son = tmp;
}
return root;
}
在商场上,公司合并可是常态,假设某两个经理签署了合并协议,那这两个公司所有人都成了一家人,当然新总裁是谁还是要看上帝的心情
void join(int root1, int root2) //两位经理的 id
{
int x, y;
x = unionsearch(root1);//总裁1
y = unionsearch(root2);//总裁2
if(x != y)
pre[x] = y; //合并
}