UVA11987- Almost Union-Find

来源:互联网 发布:网络主播文儿的歌曲 编辑:程序博客网 时间:2024/04/19 08:21

本题比较难处理的是删除之后根节点的归属,所以要开2倍的数组,如

void init() {    for (int i = 1; i <= n; i++) {        f[i] = i + n;        f[i + n] = i + n;        sum[i + n] = i;         cnt[i + n] = 1;    }}

再开两个数组分别记录集合元素的个数,以及集合元素的和。



#include <iostream>#include <cstdio>#include <cstring>#define N 100005using namespace std;int f[N * 2], cnt[N * 2], sum[N * 2];int n, m, a, b, k;void init() {    for (int i = 1; i <= n; i++) {        f[i] = i + n;        f[i + n] = i + n;        sum[i + n] = i;         cnt[i + n] = 1;    }}int getFather(int x) {    return x == f[x] ? x : f[x] = getFather(f[x]);}void Delete(int a, int b) {    int pa = getFather(a);    int pb = getFather(b);    if (pa != pb) {        f[a] = getFather(pb);         sum[pa] -= a;        sum[pb] += a;        cnt[pa]--;         cnt[pb]++;    }}void Union(int a, int b) {    int pa = getFather(a);    int pb = getFather(b);    if (pa != pb) {        f[pa] = getFather(pb);         sum[pb] += sum[pa];         cnt[pb] += cnt[pa];     }}int main() {    while (scanf("%d %d", &n, &m) != EOF) {        init();         for (int i = 0; i < m; i++) {            scanf("%d", &k);             if (k == 1) {                scanf("%d %d", &a, &b);                Union(a, b);            }               else if (k == 2) {                scanf("%d %d", &a, &b);                Delete(a, b);             }             else if (k == 3) {                scanf("%d", &a);                 int pa = getFather(a);                 printf("%d %d\n", cnt[pa], sum[pa]);             }        }     }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学生证没有充磁买不了学生票怎么办 买学生票不在优惠区间怎么办 火车票学生优惠次数用完怎么办 学生乘火车优惠磁卡丢了怎么办 磁卡锁的卡丢了怎么办 电梯磁卡扣丢了怎么办 买火车票手机号填错了怎么办 买火车票乘客身份核验失败怎么办 火车票不在一个车厢怎么办站票 坐火车丢东西了怎么办 g2坐过站了怎么办 坐火车买近了怎么办 打印的纸质火车票丢失怎么办 格力空调没保修单怎么办 格力空调不兑现保修怎么办 哈空调如果退市怎么办 空调保修单丢了怎么办 海尔空调发票丢了怎么办 格力空调发票丢了怎么办 联程航班第一程延误怎么办 飞机经停10小时怎么办 去车站买票没带身份证怎么办 转机航班第一班延误了怎么办 转机航班第一班取消了怎么办 香港转机大陆行李托运怎么办 联程车票第一班车晚点怎么办 到了普吉机场接机怎么办 被骚扰电话打个不停怎么办 网贷不停发信息怎么办 网贷天天发信息怎么办 诈骗电话一直打个不停怎么办 寄快递电话号码写错了怎么办 寄快递收件人号码错了怎么办 嫒和媛分不清楚怎么办 快递柜单号没了怎么办 邮政蜜蜂箱 退件怎么办 手机狂收验证码怎么办 快递柜超过24小时怎么办 快递柜短信删了怎么办 丰巢电话留错了怎么办 e栈快递员软件打不开怎么办