#include <cstdio> #include <vector> #define MAXM 2000001 int D; int gmax; std::vector<int> graf[MAXM]; int stopien[MAXM] = {0}; int done[MAXM] = {0}; int sklad[MAXM] = {0}; void wywal(int n) { if (done[n]) return; if (stopien[n] >= D) return; done[n] = 1; for (int i=0; i<graf[n].size(); ++i) { int next = graf[n][i]; --stopien[next]; wywal(next); } } int mieszaj(int I, int n) { if (stopien[n] < D) return 0; if (sklad[n] != 0) return 0; sklad[n] = I; int sum = 1; for (int k = 0; k < graf[n].size(); ++k) { sum += mieszaj(I, graf[n][k]); } return sum; } int main() { int kmax; scanf("%d%d%d", &gmax, &kmax, &D); for (int i=0; i<kmax; ++i) { int a, b; scanf("%d%d",&a,&b); graf[a].push_back(b); graf[b].push_back(a); stopien[a]++; stopien[b]++; } for (int i=1; i<=gmax; ++i) { wywal(i); } int maxi = 0; int maxg = 0; for (int i=1; i<=gmax; ++i) { int ile = mieszaj(i,i); if (ile > maxg) { maxg = ile; maxi = i; } } if (maxg == 0) { printf("NIE\n"); return 0; } printf("%d\n", maxg); for (int i=1; i<=gmax; ++i) { if (sklad[i] == maxi) printf("%d ", 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 84 85 86 | #include <cstdio> #include <vector> #define MAXM 2000001 int D; int gmax; std::vector<int> graf[MAXM]; int stopien[MAXM] = {0}; int done[MAXM] = {0}; int sklad[MAXM] = {0}; void wywal(int n) { if (done[n]) return; if (stopien[n] >= D) return; done[n] = 1; for (int i=0; i<graf[n].size(); ++i) { int next = graf[n][i]; --stopien[next]; wywal(next); } } int mieszaj(int I, int n) { if (stopien[n] < D) return 0; if (sklad[n] != 0) return 0; sklad[n] = I; int sum = 1; for (int k = 0; k < graf[n].size(); ++k) { sum += mieszaj(I, graf[n][k]); } return sum; } int main() { int kmax; scanf("%d%d%d", &gmax, &kmax, &D); for (int i=0; i<kmax; ++i) { int a, b; scanf("%d%d",&a,&b); graf[a].push_back(b); graf[b].push_back(a); stopien[a]++; stopien[b]++; } for (int i=1; i<=gmax; ++i) { wywal(i); } int maxi = 0; int maxg = 0; for (int i=1; i<=gmax; ++i) { int ile = mieszaj(i,i); if (ile > maxg) { maxg = ile; maxi = i; } } if (maxg == 0) { printf("NIE\n"); return 0; } printf("%d\n", maxg); for (int i=1; i<=gmax; ++i) { if (sklad[i] == maxi) printf("%d ", i); } return 0; } |