#include <cstdio> #include <algorithm> #include <set> #include <queue> #include <bitset> std::set<int> v[200000]; std::bitset<200000> zlicz; std::queue<int> DQ; int *Q = NULL, *Q2 = NULL, K[200001], K2[200001]; int q[200000], n, m, a, b; uint d; int main() { Q=K; Q2=K2; scanf("%d%d%u", &n, &m, &d); for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); v[a-1].insert(b-1); // nlogn v[b-1].insert(a-1); // nlogn } for (int i = 0; i < n; i++) { q[i] = i; if (v[i].size() < d) { DQ.push(i); } } while(DQ.size()) { int i = DQ.front(); DQ.pop(); if (v[i].size() < d) { for (auto l : v[i]) { if (v[l].size() == d) { DQ.push(l); } v[l].erase(i); // also nlogn } v[i].clear(); // nlogn } } int max = -1, maxof; for (int i = 0; i < n; i++) { if (v[i].size() > 0) { int of = 1; int mf = 0; Q[0] = i; // Q.push(i); // zakodzic Q na tablicy zlicz[i] = true; int curwyn = 1; while(mf < of) { int c = Q[mf++]; for (auto g : v[c]) { if (!zlicz[g]) { Q[of++] = g; zlicz[g] = true; curwyn++; } } } if (curwyn > max) { max = curwyn; maxof = of; std::swap(Q, Q2); } } } if (max < 0) { printf("NIE\n"); } else { std::sort(Q2, Q2+maxof); printf("%d\n", max); int of = 0; while (of < maxof) { printf("%d ", Q2[of++]+1); } printf("\n"); } }
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 | #include <cstdio> #include <algorithm> #include <set> #include <queue> #include <bitset> std::set<int> v[200000]; std::bitset<200000> zlicz; std::queue<int> DQ; int *Q = NULL, *Q2 = NULL, K[200001], K2[200001]; int q[200000], n, m, a, b; uint d; int main() { Q=K; Q2=K2; scanf("%d%d%u", &n, &m, &d); for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); v[a-1].insert(b-1); // nlogn v[b-1].insert(a-1); // nlogn } for (int i = 0; i < n; i++) { q[i] = i; if (v[i].size() < d) { DQ.push(i); } } while(DQ.size()) { int i = DQ.front(); DQ.pop(); if (v[i].size() < d) { for (auto l : v[i]) { if (v[l].size() == d) { DQ.push(l); } v[l].erase(i); // also nlogn } v[i].clear(); // nlogn } } int max = -1, maxof; for (int i = 0; i < n; i++) { if (v[i].size() > 0) { int of = 1; int mf = 0; Q[0] = i; // Q.push(i); // zakodzic Q na tablicy zlicz[i] = true; int curwyn = 1; while(mf < of) { int c = Q[mf++]; for (auto g : v[c]) { if (!zlicz[g]) { Q[of++] = g; zlicz[g] = true; curwyn++; } } } if (curwyn > max) { max = curwyn; maxof = of; std::swap(Q, Q2); } } } if (max < 0) { printf("NIE\n"); } else { std::sort(Q2, Q2+maxof); printf("%d\n", max); int of = 0; while (of < maxof) { printf("%d ", Q2[of++]+1); } printf("\n"); } } |