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