您的位置:首页 > 其它

UVA11987 带删除的并查集

2016-09-30 17:15 211 查看
第一次做这种并查集…

删除这个动作实在是不好想…

只要坐标超过最大给他个新内存就可以了

原来的地方给他留着用来存以前的集合最大值…

但是位置改到新坐标去

然后属性复制过去就可以了

#include<iostream>
#include<algorithm>
#include<memory.h>
#include<cstdio>
using namespace std;
int n, m;
struct p
{
int baba, zhi, geshu,weizhi;
};
p gesh[200001];
int zhao(int q)
{
while (q != gesh[q].baba)q = gesh[q].baba;
return q;
}
void hebing(int q, int w)
{
int qw = zhao(q);
int wq = zhao(w);
gesh[qw].baba = wq;
gesh[wq].zhi += gesh[qw].zhi;
gesh[wq].geshu += gesh[qw].geshu;
}
int main()
{
while (cin >> n >> m)
{
int gaga = 0;
memset(gesh, 0, sizeof(gesh));
for (int a = 1;a <= n;a++)gesh[a] = { a,a,1,a};
while (m--)
{
int y;
scanf("%d", &y);
int s, d,sb,sd;
if (y == 1)
{
scanf("%d%d", &s, &d);
sb = zhao(gesh[s].weizhi);
sd = zhao(gesh[d].weizhi);
if (sb != sd)hebing(sb, sd);
}
else if (y == 2)
{
scanf("%d%d", &s, &d);
sb = zhao(gesh[s].weizhi);
sd = zhao(gesh[d].weizhi);
gaga++;
gesh[100000 + gaga].geshu = 1;
gesh[100000 + gaga].zhi = s;
gesh[s].weizhi = 100000 + gaga;
gesh[100000+gaga].baba = 100000 + gaga;
gesh[sb].zhi -= s;
gesh[sb].geshu -= 1;
hebing(100000 + gaga, sd);
}
else
{
scanf("%d", &s);
d = zhao(gesh[s].weizhi);
printf("%d %d\n", gesh[d].geshu, gesh[d].zhi);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: