并查集的简单运用
#include <bits/stdc++.h>
struct DSU {
std::vector<int> f;
DSU(int n) : f(n, -1) { }
int leader(int x) {
return f[x] < 0 ? x : f[x] = leader(f[x]);
}
bool same(int x, int y) {
return leader(x) == leader(y);
}
int size(int x) {
return -f[leader(x)];
}
int merge(int a, int b) {
int x = leader(a), y = leader(b);
if (x == y) return x;
if (-f[x] < -f[y]) std::swap(x, y);
f[x] += f[y];
f[y] = x;
return x;
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m;
while (std::cin >> n >> m) {
DSU g(n);
for (int i = 0; i < m; ++ i) {
int u, v;
std::cin >> u >> v;
u --;
v --;
g.merge(u, v);
}
if (g.size(0) != n) {
std::cout << "NO\n";
} else {
std::cout << "YES\n";
}
}
return 0;
}