#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; } |