题解 | 第一题

#include <iostream>
using namespace std;

#define MAXSIZE 640000
int T[MAXSIZE];
bool Avail[MAXSIZE];

void Init()
{
    for (int i = 0; i < MAXSIZE; i++) {
        T[i] = -1;
        Avail[i] = false;
    }
}

int FindRoot(int x) {
    while (T[x] >= 0) {
        x = T[x];
    }
    return x;
}

void Union(int a, int b)
{
    int rta = FindRoot(a);
    int rtb = FindRoot(b);
    if (rta == rtb)
        return;
    if (T[rta] < T[rtb]) {
        T[rta] += T[rtb];
        T[rtb] = rta;
    }
    else {
        T[rtb] += T[rta];
        T[rta] = rtb;
    }
}

int main() {
    Init();
    int a, b;
    while (cin >> a >> b) { // 注意 while 处理多个 case
        Avail[a] = true;
        Avail[b] = true;
        Union(a, b);
    }
    int cnt = 0;
    for (int i = 0; i < MAXSIZE; i++) {
        if (Avail[i] && T[i] < 0) {
            cnt++;
        }
    }
    cout << cnt;
    return 0;
}
// 64 位输出请用 printf("%lld")

题目是很基础的并查集。

坑点有两个,一个是数组不能开太小,还有一个是习惯了力扣模式返回值设成了结果,提交就报错,返回值要设置为零。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务