#include <cstdio> #include <vector> using namespace std; const int MAXN = 200007; vector<int> sasiedzi[MAXN]; int waga[MAXN]; bool odrzucony[MAXN]; int odwiedzony[MAXN]; int d; void odrzucaj(int v) { if (waga[v] < d && !odrzucony[v]) { odrzucony[v] = true; for (vector<int>::iterator it = sasiedzi[v].begin(); it != sasiedzi[v].end(); it++) { if (!odrzucony[*it]) { waga[*it]--; odrzucaj(*it); } } } } int skladowa(int v, int korzen) { int wynik = 1; odwiedzony[v] = korzen; for (vector<int>::iterator it = sasiedzi[v].begin(); it != sasiedzi[v].end(); it++) { if (!odrzucony[*it] && odwiedzony[*it] == 0) { wynik += skladowa(*it, korzen); } } return wynik; } int main() { int n, m, b, e, mx = 0; scanf("%d%d%d", &n, &m, &d); for (int i = 0; i < m; i++) { scanf("%d%d", &b, &e); sasiedzi[b].push_back(e); sasiedzi[e].push_back(b); } for (int i = 1; i <= n; i++) waga[i] = sasiedzi[i].size(); for (int i = 1; i <= n; i++) odrzucaj(i); for (int i = 1; i <= n; i++) if (odrzucony[i] || odwiedzony[i]) { waga[i] = 0; } else { waga[i] = skladowa(i, i); if (waga[i] > mx) mx = waga[i]; } if (mx == 0) { printf("NIE\n"); return 0; } for (int i = 1; i <= n; i++) if (waga[i] == mx) { printf("%d\n", mx); for (int j = 1; j <= n; j++) if (odwiedzony[j] == i) printf("%d ", j); i = n + 1; } }
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 | #include <cstdio> #include <vector> using namespace std; const int MAXN = 200007; vector<int> sasiedzi[MAXN]; int waga[MAXN]; bool odrzucony[MAXN]; int odwiedzony[MAXN]; int d; void odrzucaj(int v) { if (waga[v] < d && !odrzucony[v]) { odrzucony[v] = true; for (vector<int>::iterator it = sasiedzi[v].begin(); it != sasiedzi[v].end(); it++) { if (!odrzucony[*it]) { waga[*it]--; odrzucaj(*it); } } } } int skladowa(int v, int korzen) { int wynik = 1; odwiedzony[v] = korzen; for (vector<int>::iterator it = sasiedzi[v].begin(); it != sasiedzi[v].end(); it++) { if (!odrzucony[*it] && odwiedzony[*it] == 0) { wynik += skladowa(*it, korzen); } } return wynik; } int main() { int n, m, b, e, mx = 0; scanf("%d%d%d", &n, &m, &d); for (int i = 0; i < m; i++) { scanf("%d%d", &b, &e); sasiedzi[b].push_back(e); sasiedzi[e].push_back(b); } for (int i = 1; i <= n; i++) waga[i] = sasiedzi[i].size(); for (int i = 1; i <= n; i++) odrzucaj(i); for (int i = 1; i <= n; i++) if (odrzucony[i] || odwiedzony[i]) { waga[i] = 0; } else { waga[i] = skladowa(i, i); if (waga[i] > mx) mx = waga[i]; } if (mx == 0) { printf("NIE\n"); return 0; } for (int i = 1; i <= n; i++) if (waga[i] == mx) { printf("%d\n", mx); for (int j = 1; j <= n; j++) if (odwiedzony[j] == i) printf("%d ", j); i = n + 1; } } |