#include <iostream>
#include <set>
#include <vector>
#include <queue>
#include <array>
#include <algorithm>
//musimy trzymac
// -listy sasiedztwa
// -stopnie wierzcholkow
//
//
//zrob zbior wszystkich wierzcholkow z deg < D
//
// wez dowolny wierzcholek deg < D
// wywal go
// przelec po wszystkich jego krawedziach
int main()
{
int d, n, m;
std::cin >> n >> m >> d;
int *wagi = new int[n+1];
int *grupy = new int[n+1];
int *wyjebane = new int[n+1];
std::queue<int> dowyjebania;
std::array<std::set<int>, 1024*200> hood;
for (int i_n = 1; i_n < n+1; i_n++) {
wagi[i_n] = 0;
wyjebane[i_n] = 0;
grupy[i_n] = 0;
}
for (int i_m = 0; i_m < m; i_m++) {
int f, t;
std::cin >> f >> t;
wagi[f]++;
wagi[t]++;
hood[f].insert(t);
hood[t].insert(f);
}
for (int i_n = 1; i_n < n+1; i_n++) {
wyjebane[i_n] = 0;
if (wagi[i_n] < d) {
dowyjebania.push(i_n);
// std::cout << "Wywalam " << i_n << std::endl;
wyjebane[i_n] = -1;
}
}
while (!dowyjebania.empty()) {
auto it = dowyjebania.front();
for (auto r = hood[it].begin(); r != hood[it].end(); r++) {
wagi[*r]--;
hood[*r].erase(it);
if (wagi[*r] < d && (0 == (wyjebane[*r]))) {
dowyjebania.push(*r);
// std::cout << "Wywalam " << *r << std::endl;
wyjebane[*r] = -1;
}
}
dowyjebania.pop();
}
for (int i_n = 1; i_n < n+1; i_n++) {
if (0==wyjebane[i_n]) {
std::queue<int> q;
q.push(i_n);
while (!q.empty()) {
int e = q.front();
q.pop();
if (wyjebane[e] != 0)
continue;
for (auto it = hood[e].begin(); it != hood[e].end(); it++) {
if (wyjebane[*it] == 0) {
q.push(*it);
}
}
wyjebane[e] = i_n;
}
}
// std::cout << i_n << " " << wyjebane[i_n] << std::endl;
}
int maks = 0;
int maks_i = 0;
for (int i_n = 1; i_n < n+1; i_n++) {
if (wyjebane[i_n] > 0) {
grupy[wyjebane[i_n]] ++;
if (maks <= grupy[wyjebane[i_n]]) {
maks = grupy[wyjebane[i_n]];
maks_i = wyjebane[i_n];
}
}
}
if (maks_i == 0) {
std::cout << "NIE" << std::endl;
} else {
std::cout << maks << std::endl;
for (int i_n = 1; i_n < n+1; i_n++) {
if (wyjebane[i_n] == maks_i)
std::cout << i_n << " ";
}
std::cout << std::endl;
}
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <iostream> #include <set> #include <vector> #include <queue> #include <array> #include <algorithm> //musimy trzymac // -listy sasiedztwa // -stopnie wierzcholkow // // //zrob zbior wszystkich wierzcholkow z deg < D // // wez dowolny wierzcholek deg < D // wywal go // przelec po wszystkich jego krawedziach int main() { int d, n, m; std::cin >> n >> m >> d; int *wagi = new int[n+1]; int *grupy = new int[n+1]; int *wyjebane = new int[n+1]; std::queue<int> dowyjebania; std::array<std::set<int>, 1024*200> hood; for (int i_n = 1; i_n < n+1; i_n++) { wagi[i_n] = 0; wyjebane[i_n] = 0; grupy[i_n] = 0; } for (int i_m = 0; i_m < m; i_m++) { int f, t; std::cin >> f >> t; wagi[f]++; wagi[t]++; hood[f].insert(t); hood[t].insert(f); } for (int i_n = 1; i_n < n+1; i_n++) { wyjebane[i_n] = 0; if (wagi[i_n] < d) { dowyjebania.push(i_n); // std::cout << "Wywalam " << i_n << std::endl; wyjebane[i_n] = -1; } } while (!dowyjebania.empty()) { auto it = dowyjebania.front(); for (auto r = hood[it].begin(); r != hood[it].end(); r++) { wagi[*r]--; hood[*r].erase(it); if (wagi[*r] < d && (0 == (wyjebane[*r]))) { dowyjebania.push(*r); // std::cout << "Wywalam " << *r << std::endl; wyjebane[*r] = -1; } } dowyjebania.pop(); } for (int i_n = 1; i_n < n+1; i_n++) { if (0==wyjebane[i_n]) { std::queue<int> q; q.push(i_n); while (!q.empty()) { int e = q.front(); q.pop(); if (wyjebane[e] != 0) continue; for (auto it = hood[e].begin(); it != hood[e].end(); it++) { if (wyjebane[*it] == 0) { q.push(*it); } } wyjebane[e] = i_n; } } // std::cout << i_n << " " << wyjebane[i_n] << std::endl; } int maks = 0; int maks_i = 0; for (int i_n = 1; i_n < n+1; i_n++) { if (wyjebane[i_n] > 0) { grupy[wyjebane[i_n]] ++; if (maks <= grupy[wyjebane[i_n]]) { maks = grupy[wyjebane[i_n]]; maks_i = wyjebane[i_n]; } } } if (maks_i == 0) { std::cout << "NIE" << std::endl; } else { std::cout << maks << std::endl; for (int i_n = 1; i_n < n+1; i_n++) { if (wyjebane[i_n] == maks_i) std::cout << i_n << " "; } std::cout << std::endl; } return 0; } |
English