30 分求好心人帮助修改 急急急!!!
  • 板块P2078 朋友
  • 楼主telankesi
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/1/10 23:30
  • 上次更新2023/10/24 04:48:49
查看原帖
30 分求好心人帮助修改 急急急!!!
866969
telankesi楼主2023/1/10 23:30
#include<stdio.h>
#include <math.h>
int n, m, p, q;
int pre1[50010],pre2[50010];
int num1 = 1, num2 = 1;
int g = 1, h = 1;
int find1(int x) {
    if (x == pre1[x])return x;
    else { g++; 
    return pre1[x] = find1(pre1[x]);
    }
}
int find2(int x) {
    if (x == pre2[x])return x;
    else {
        h++; return pre2[x] = find2(pre2[x]);
    }
}
void  joint1(int x,int y) {
    int a = find1(x);
    int b = find1(y);
    if (a != b) {
        if (a == 1 && b != 1 || b == 1 && a != 1)    num1 += g;
        g = 1;
        if (b == 1)
            pre1[a] = b;
        else pre1[b] = a;
    }
}
void  joint2(int x, int y) {
    int a = find2(x);
    int b = find2(y);
    if (a != b) {
        
        if (a == 1&&b!=1 || b == 1&&a!=1)   num2 += h;
        h = 1;
        if (b == 1)pre2[a] = b;
        else pre2[b] = a;
    }
}
int main() {
    scanf("%d %d %d %d", &n, &m, &p, &q);
    for (int i = 1; i <= 50000; i++) {
        pre1[i] = i;
        pre2[i] = i;
    }
    int a, b;
    
    for (int i = 1; i <= p; i++) {
        scanf("%d %d", &a, &b);
        
        joint1(a, b);
    }
    for (int i = 1; i <= q; i++) {
        scanf("%d %d", &a, &b);
        joint2(abs(a),abs(b));
    }
    if (num1 > num2)printf("%d", num2);
    else printf("%d", num1);
    return 0;
}
2023/1/10 23:30
加载中...