并查集

题意:

图片说明

分析:

很简单,直接并查集。自己再改改,维护一个cnt[i]记录集合i中有多少个元素就可以了。

题解并不是我真正的目的,我真正的目的是:

我永远喜欢小木曾雪菜!!!!!!!!!

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int max_n = 1e4 + 100;
int n, m;

int par[max_n];
int rak[max_n];
int cnt[max_n];

void init() {
    for (int i = 1;i <= n;i++)par[i] = i;
    fill(rak + 1, rak + 1 + n, 0);
    fill(cnt + 1, cnt + 1 + n, 1);
}

int find(int x) {
    return par[x] == x ? par[x] : par[x] = find(par[x]);
}

bool same(int u,int v) {
    return find(u) == find(v);
}

bool merge(int u,int v) {
    u = find(u);v = find(v);
    if (same(u, v))return false;
    if (rak[u] > rak[v]) {
        par[v] = u;
        cnt[u] += cnt[v];
        cnt[v] = 0;
    }
    else if (rak[v] > rak[u]) {
        par[u] = v;
        cnt[v] += cnt[u];
        cnt[u] = 0;
    }
    else {
        par[v] = u;
        rak[u]++;
        cnt[u] += cnt[v];
        cnt[v] = 0;
    }return true;
}

int main() {
    ios::sync_with_stdio(0);
    cin >> n >> m;init();
    for (int i = 1;i <= m;i++) {
        int u, v;cin >> u >> v;
        merge(u, v);
    }
    bool flag = false;
    for (int i = 1;i <= n;i++) {
        if (cnt[i] >= 3) {
            flag = true;
            break;
        }
    }
    if (flag)cout << "Error\n";
    else cout << "Nice\n";
}