#include <vector>
#include <algorithm>
#include <cstdio>
#include <cassert>
using namespace std;
//#define DEBUG
#ifdef DEBUG
#define ASSERT(x) assert(x)
#define DEBPRINT(...) fprintf(stderr, __VA_ARGS__)
#else
#define ASSERT(x)
#define DEBPRINT(...)
#endif
#define MAXN 200007
int N, M, D;
vector<int> E[MAXN];
int En[MAXN];
vector<int> Q;
vector<int> SSC[MAXN];
int SSCn;
int C[MAXN];
int R;
int main() {
int i, j, ii;
scanf("%d%d%d", &N, &M, &D);
R = N;
for (i = 0; i < M; i++) {
int a, b;
scanf("%d%d", &a, &b);
E[a-1].push_back(b-1);
E[b-1].push_back(a-1);
}
for (i = 0; i < N; i++) {
En[i] = E[i].size();
if (En[i] < D) {
R--;
Q.push_back(i);
DEBPRINT("(%d) ", i);
}
}
for (i = 0; i < Q.size(); i++) {
int k = Q[i];
for (j = 0; j < E[k].size(); j++) {
int l = E[k][j];
if (En[l] >= D) { // l still active.
En[l]--; // connection from k removed.
if (En[l] < D) {
R--;
Q.push_back(l);
DEBPRINT("(%d) ", l);
}
}
}
}
DEBPRINT("\n");
if (R == 0) {
printf("NIE\n");
return 0;
}
SSCn = 0;
for (i = 0; i < N; i++) {
if (En[i] >= D && C[i] == 0) {
SSC[SSCn].push_back(i);
C[i] = 1;
DEBPRINT("[%d] ", i);
for (j = 0; j < SSC[SSCn].size(); j++) {
int k = SSC[SSCn][j];
for (ii = 0; ii < E[k].size(); ii++) {
int l = E[k][ii];
if (En[l] >= D && C[l] == 0) {
SSC[SSCn].push_back(l);
C[l] = 1;
DEBPRINT("[%d] ", l);
}
}
}
SSCn++;
DEBPRINT("\n");
}
}
ASSERT(SSCn > 0);
if (SSCn == 0) {
printf("NIE\n");
return 0;
}
ii = 0;
for (i = 1; i < SSCn; i++)
if (SSC[i].size() > SSC[ii].size())
ii = i;
sort(SSC[ii].begin(), SSC[ii].end());
printf("%d\n%d", SSC[ii].size(), SSC[ii][0]+1);
for (i = 1; i < SSC[ii].size(); i++)
printf(" %d", SSC[ii][i]+1);
printf("\n");
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 103 104 105 106 | #include <vector> #include <algorithm> #include <cstdio> #include <cassert> using namespace std; //#define DEBUG #ifdef DEBUG #define ASSERT(x) assert(x) #define DEBPRINT(...) fprintf(stderr, __VA_ARGS__) #else #define ASSERT(x) #define DEBPRINT(...) #endif #define MAXN 200007 int N, M, D; vector<int> E[MAXN]; int En[MAXN]; vector<int> Q; vector<int> SSC[MAXN]; int SSCn; int C[MAXN]; int R; int main() { int i, j, ii; scanf("%d%d%d", &N, &M, &D); R = N; for (i = 0; i < M; i++) { int a, b; scanf("%d%d", &a, &b); E[a-1].push_back(b-1); E[b-1].push_back(a-1); } for (i = 0; i < N; i++) { En[i] = E[i].size(); if (En[i] < D) { R--; Q.push_back(i); DEBPRINT("(%d) ", i); } } for (i = 0; i < Q.size(); i++) { int k = Q[i]; for (j = 0; j < E[k].size(); j++) { int l = E[k][j]; if (En[l] >= D) { // l still active. En[l]--; // connection from k removed. if (En[l] < D) { R--; Q.push_back(l); DEBPRINT("(%d) ", l); } } } } DEBPRINT("\n"); if (R == 0) { printf("NIE\n"); return 0; } SSCn = 0; for (i = 0; i < N; i++) { if (En[i] >= D && C[i] == 0) { SSC[SSCn].push_back(i); C[i] = 1; DEBPRINT("[%d] ", i); for (j = 0; j < SSC[SSCn].size(); j++) { int k = SSC[SSCn][j]; for (ii = 0; ii < E[k].size(); ii++) { int l = E[k][ii]; if (En[l] >= D && C[l] == 0) { SSC[SSCn].push_back(l); C[l] = 1; DEBPRINT("[%d] ", l); } } } SSCn++; DEBPRINT("\n"); } } ASSERT(SSCn > 0); if (SSCn == 0) { printf("NIE\n"); return 0; } ii = 0; for (i = 1; i < SSCn; i++) if (SSC[i].size() > SSC[ii].size()) ii = i; sort(SSC[ii].begin(), SSC[ii].end()); printf("%d\n%d", SSC[ii].size(), SSC[ii][0]+1); for (i = 1; i < SSC[ii].size(); i++) printf(" %d", SSC[ii][i]+1); printf("\n"); return 0; } |
English