/* * ===================================================================================== * * Filename: 920E.cpp * * Description: codeforces 920E: Connected Components? * * Version: 1.0 * Created: 2018/02/08 (yyyy/mm/dd) * Revision: none * Compiler: g++14 * * Author: lionking * Organization: None * * ===================================================================================== */ #include <cstdio> #include <vector> #include <queue> #include <algorithm> #include <unordered_set> constexpr size_t MAX_VAL = 200000; template <typename T> using uset = std::unordered_set<T>; void findCC(const int N, const std::vector< uset<int> >& rm_edge) { std::vector<size_t> result; uset<int> remain(N + 1); // remaining un-visited vertices for (int i = 1; i <= N; ++i) { remain.emplace(i); } while (remain.empty() == false) { size_t count = 1; auto node = *(remain.begin()); remain.erase(node); std::queue<int> q; q.push(node); while (q.empty() == false) { node = q.front(); q.pop(); auto iter = remain.begin(); while (iter != remain.end()) { const auto next = *iter; if (rm_edge[node].find(next) != rm_edge[node].cend()) { ++iter; } else { q.push(next); count++; iter = remain.erase(iter); } } } result.push_back(count); } sort(result.begin(), result.end()); printf("%lu\n", result.size()); for (const auto& v : result) { printf("%lu ", v); } putchar('\n'); } int main() { int n, m; while (scanf("%d %d", &n, &m) == 2) { std::vector< uset<int> > rm_edge(n + 1); for (int i = 0; i < m; ++i) { int x, y; if (scanf("%d %d", &x, &y) == 2) { rm_edge[x].emplace(y); rm_edge[y].emplace(x); } } findCC(n, rm_edge); } return 0; }