#include <iostream> #include <vector> #include <set> using namespace std; int n, m, d, a, b, alfa, gdzie = -1; const int stala = 200007; bool elim[stala], odw[stala]; int st[stala]; bool wyn[stala]; int wynik; struct wie { int x; int st; }; bool operator<(wie w1, wie w2) { if(w1.st == w2.st) return w1.x < w2.x; return w1.st < w2.st; } set<wie> S; wie pom, dod; vector<int> do_odw[stala]; void DFS(int x) { odw[x] = 1; alfa++; for(int j = do_odw[x].size()-1; j >= 0; j--) { if(odw[ do_odw[x][j] ] == 0 && elim[ do_odw[x][j] ] == 0) { DFS(do_odw[x][j]); } } } int main() { ios_base::sync_with_stdio(0); cin >> n >> m >> d; for(int i = 0; i < m; i++) { cin >> a >> b; st[a]++; st[b]++; do_odw[a].push_back(b); do_odw[b].push_back(a); } for(int i = 1; i <= n; i++) { if(st[i] < d) { pom.x = i; pom.st = st[i]; S.insert(pom); } } while(!S.empty()) { pom.x = S.begin()->x; pom.st = S.begin()->st; S.erase(S.begin()); if(odw[pom.x] == 1) continue; if(pom.st >= d) break; elim[pom.x] = 1; odw[pom.x] = 1; for(int i = do_odw[pom.x].size()-1; i >= 0; i--) { if(odw[do_odw[pom.x][i]] == 0) { dod.x = do_odw[pom.x][i]; dod.st = st[do_odw[pom.x][i]]-1; st[do_odw[pom.x][i]]--; S.insert(dod); } } } wynik = 0; for(int i = 1; i <= n; i++) odw[i] = 0; for(int i = 1; i <= n; i++) { //cout << elim[i] << " " << odw[i] << endl; if(elim[i] == 0 && odw[i] == 0) { alfa = 0; DFS(i); if(alfa > wynik) { wynik = alfa; gdzie = i; } } } if(wynik == 0) { cout << "NIE"; return 0; } for(int i = 1; i <= n; i++) odw[i] = 0; DFS(gdzie); cout << wynik << "\n"; for(int i = 1; i <= n; i++) if(odw[i] == 1) cout << 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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #include <vector> #include <set> using namespace std; int n, m, d, a, b, alfa, gdzie = -1; const int stala = 200007; bool elim[stala], odw[stala]; int st[stala]; bool wyn[stala]; int wynik; struct wie { int x; int st; }; bool operator<(wie w1, wie w2) { if(w1.st == w2.st) return w1.x < w2.x; return w1.st < w2.st; } set<wie> S; wie pom, dod; vector<int> do_odw[stala]; void DFS(int x) { odw[x] = 1; alfa++; for(int j = do_odw[x].size()-1; j >= 0; j--) { if(odw[ do_odw[x][j] ] == 0 && elim[ do_odw[x][j] ] == 0) { DFS(do_odw[x][j]); } } } int main() { ios_base::sync_with_stdio(0); cin >> n >> m >> d; for(int i = 0; i < m; i++) { cin >> a >> b; st[a]++; st[b]++; do_odw[a].push_back(b); do_odw[b].push_back(a); } for(int i = 1; i <= n; i++) { if(st[i] < d) { pom.x = i; pom.st = st[i]; S.insert(pom); } } while(!S.empty()) { pom.x = S.begin()->x; pom.st = S.begin()->st; S.erase(S.begin()); if(odw[pom.x] == 1) continue; if(pom.st >= d) break; elim[pom.x] = 1; odw[pom.x] = 1; for(int i = do_odw[pom.x].size()-1; i >= 0; i--) { if(odw[do_odw[pom.x][i]] == 0) { dod.x = do_odw[pom.x][i]; dod.st = st[do_odw[pom.x][i]]-1; st[do_odw[pom.x][i]]--; S.insert(dod); } } } wynik = 0; for(int i = 1; i <= n; i++) odw[i] = 0; for(int i = 1; i <= n; i++) { //cout << elim[i] << " " << odw[i] << endl; if(elim[i] == 0 && odw[i] == 0) { alfa = 0; DFS(i); if(alfa > wynik) { wynik = alfa; gdzie = i; } } } if(wynik == 0) { cout << "NIE"; return 0; } for(int i = 1; i <= n; i++) odw[i] = 0; DFS(gdzie); cout << wynik << "\n"; for(int i = 1; i <= n; i++) if(odw[i] == 1) cout << i << " "; return 0; } |