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
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
set <int> kr[200005];
set < pair <int,int> > s;
int n,m,d;
bool odw[200005];
vector <int> best, best2;
void dfs(int start){
    odw[start] = true;
    best2.push_back(start);
    for (set <int>::iterator i = kr[start].begin(); i != kr[start].end(); i++){
        if (!odw[*i]){
            dfs(*i);
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&d);
    for (int i = 0; i < m; i++){
        int a,b;
        scanf("%d%d",&a,&b);
        kr[a].insert(b);
        kr[b].insert(a);
    }
    for (int i = 1; i <= n; i++){
        s.insert(make_pair(kr[i].size(), i));
    }
    while (!s.empty()){
        pair <int,int> f = *s.begin();
        s.erase(s.begin());
        if (f.first >= d){
            s.clear();
        }
        else {
            for (set <int>::iterator j = kr[f.second].begin(); j != kr[f.second].end(); j++){
                int to = *j;
                s.erase(make_pair(kr[to].size(), to));
                kr[to].erase(f.second);
                s.insert(make_pair(kr[to].size(), to));
            }
            kr[f.second].clear();
        }
    }
    for (int i = 1; i <= n; i++){
        if ((!odw[i]) && (kr[i].size() >= d)){
            dfs(i);
            if (best2.size() > best.size()){
                best.clear();
                for (int j = 0; j < best2.size(); j++){
                    best.push_back(best2[j]);
                }
            }
            best2.clear();
        }
    }
    if (best.size() == 0){
        printf("NIE\n");
    }
    else {
        printf("%d\n", best.size());
        sort(best.begin(), best.end());
        for (int i = 0; i < best.size(); i++){
            printf("%d ", best[i]);
        }
    }
}