#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
int main()
{
int n, m, d, a, b;
std::cin >> n >> m >> d;
std::vector<std::vector<int>> graph(n + 1);
std::vector<int> deg(n + 1, 0);
for (int i = 0; i < m; ++i) {
std::cin >> a >> b;
graph[a].emplace_back(b);
graph[b].emplace_back(a);
++deg[a]; ++deg[b];
}
auto comp = [&](int _v1, int _v2) { return deg[_v1] == deg[_v2] ? _v1 < _v2 : deg[_v1] < deg[_v2]; };
std::set<int, decltype(comp)> s(comp);
for (int i = 0; i < n; ++i) {
s.insert(i + 1);
}
std::vector<bool> removed(n + 1, false);
while (!s.empty() && deg[*s.begin()] < d) {
auto top = *s.begin();
s.erase(s.begin());
if (!removed[top]) {
for (auto &it : graph[top]) {
if (!removed[it]) {
s.erase(it);
--deg[it];
s.insert(it);
}
}
removed[top] = true;
}
}
if (s.empty()) {
std::cout << "NIE" << std::endl;
} else {
std::vector<int> sol1(s.size()), sol2(s.size());
std::vector<int> *best = &sol1, *local = &sol2;
int b_end = 0, l_end = 0;
while (!s.empty()) {
if (!removed[*s.begin()]) {
removed[*s.begin()] = true;
std::queue<int> q;
q.push(*s.begin());
while (!q.empty()) {
auto top = q.front();
q.pop();
(*local)[l_end++] = top;
for (auto &it : graph[top]) {
if (!removed[it]) {
q.push(it);
removed[it] = true;
}
}
}
if (l_end > b_end) {
std::swap(best, local);
std::swap(b_end, l_end);
}
l_end = 0;
}
s.erase(s.begin());
}
std::sort(best->begin(), best->begin() + b_end);
std::cout << b_end << std::endl;
for (int i = 0; i < b_end; ++i) {
std::cout << (*best)[i] << " ";
}
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <iostream> #include <vector> #include <algorithm> #include <set> #include <queue> int main() { int n, m, d, a, b; std::cin >> n >> m >> d; std::vector<std::vector<int>> graph(n + 1); std::vector<int> deg(n + 1, 0); for (int i = 0; i < m; ++i) { std::cin >> a >> b; graph[a].emplace_back(b); graph[b].emplace_back(a); ++deg[a]; ++deg[b]; } auto comp = [&](int _v1, int _v2) { return deg[_v1] == deg[_v2] ? _v1 < _v2 : deg[_v1] < deg[_v2]; }; std::set<int, decltype(comp)> s(comp); for (int i = 0; i < n; ++i) { s.insert(i + 1); } std::vector<bool> removed(n + 1, false); while (!s.empty() && deg[*s.begin()] < d) { auto top = *s.begin(); s.erase(s.begin()); if (!removed[top]) { for (auto &it : graph[top]) { if (!removed[it]) { s.erase(it); --deg[it]; s.insert(it); } } removed[top] = true; } } if (s.empty()) { std::cout << "NIE" << std::endl; } else { std::vector<int> sol1(s.size()), sol2(s.size()); std::vector<int> *best = &sol1, *local = &sol2; int b_end = 0, l_end = 0; while (!s.empty()) { if (!removed[*s.begin()]) { removed[*s.begin()] = true; std::queue<int> q; q.push(*s.begin()); while (!q.empty()) { auto top = q.front(); q.pop(); (*local)[l_end++] = top; for (auto &it : graph[top]) { if (!removed[it]) { q.push(it); removed[it] = true; } } } if (l_end > b_end) { std::swap(best, local); std::swap(b_end, l_end); } l_end = 0; } s.erase(s.begin()); } std::sort(best->begin(), best->begin() + b_end); std::cout << b_end << std::endl; for (int i = 0; i < b_end; ++i) { std::cout << (*best)[i] << " "; } } return 0; } |
English