并查集
题意:
分析:
很简单,直接并查集。自己再改改,维护一个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"; }