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