90并查集求调
查看原帖
90并查集求调
1141947
jqdlk楼主2024/2/29 15:30
#include<bits/stdc++.h>
#define MAX_N 50100
#define MAX_K 100100
int par[MAX_N];  // 父节点
int rank[MAX_N]; // 树高
int T[MAX_K], X[MAX_K], Y[MAX_K];
void init(int n)
{
    for (int i = 1; i <= n; i++)
    {
        par[i] = i;
        rank[i] = 0; // 初始化
    }
}

// 查找根
int find(int x)
{
    if (par[x] == x)
        return x;
    else
        return  find(par[x]);
}

// 合并
void integrate(int x, int y)
{
    x = find(x);
    y = find(y);
    if (x == y)
        return;
    if (rank[x] < rank[y]) // 树高
        par[x] = y;
    else
    {
        par[y] = x;
        if (rank[x] == rank[y])
            rank[x]++;
    }
}

bool same(int x, int y)
{
    return find(x) == find(y);
}

int main()
{
    int N, K;
    std::cin >> N >> K;
    init(N*3);
    for (int i = 0; i < K; i++)
    {
        std::cin >> T[i] >> X[i] >> Y[i];
    }
    int ans = 0;
    for (int i = 0; i < K; i++)
    {
        int t = T[i];
        int x = X[i] - 1;
        int y = Y[i] - 1;
        if (x < 0 || x >= N || y < 0 || y >= N)
        {
            ans++;
            continue;
        }
        if (t == 1)
        {
            if (same(x, y + N) || same(x, y + 2 * N))
            {
                ans++;
                continue;
            }
            else
            {
                integrate(x, y);
                integrate(x + N,y + N);
                integrate(x + 2 * N, y + 2 * N);
            }
        }
        else 
        {
            if (same(x, y) || same(x, y + 2 * N))
            {
                ans++;
                continue;
            }
            else
            {
                integrate(x, y + N);
                integrate(x + N, y + 2 * N);
                integrate(x + 2 * N, y);
            }
        }
    }
    std::cout << ans;
}

2024/2/29 15:30
加载中...