#include <vector> #include <algorithm> #include <set> #include <unordered_map> using namespace std; void read_data(int n, int m, vector < set <int> > &V, set < pair < int, int > > &S) { for(int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); a--; b--; V[a].insert(b); V[b].insert(a); } for(int i = 0; i < n; i++) if(!V[i].empty()) S.insert(make_pair(V[i].size(), i)); } void throw_bad(int d, set < pair < int, int > > &S, vector < set < int > > &V) { while(!S.empty()) { auto it = S.begin(); int size_ = it->first; int nr = it->second; if(size_ < d) { for(int neigh : V[nr]) { int neigh_size = V[neigh].size(); S.erase(make_pair(neigh_size, neigh)); if(--neigh_size) S.insert(make_pair(neigh_size, neigh)); V[neigh].erase(nr); } V[nr].clear(); S.erase(it); } else break; } } void dfs(int v, vector < set < int > > &V, vector < bool > &Vis, vector < int > &Comp) { Vis[v] = 1; Comp.push_back(v); for(int neigh : V[v]) if(!Vis[neigh]) dfs(neigh, V, Vis, Comp); } void get_components(set < pair < int, int > > &S, int n, vector < set < int > > &V, vector < vector < int > > &Components) { vector < bool > Vis(n, 1); for(pair <int, int> p : S) Vis[p.second] = 0; for(int i = 0; i < n; i++) if(!Vis[i]) { vector < int > Comp; dfs(i, V, Vis, Comp); Components.push_back(Comp); } } void choose_best_and_print(vector < vector < int > > &Components) { vector < int > best = Components[0]; for(vector < int > v : Components) if(v.size() > best.size()) best = v; sort(best.begin(), best.end()); printf("%d\n", best.size()); for(int i = 0; i < best.size(); i++) printf("%d ", best[i] + 1); } int main() { int n, m, d; scanf("%d %d %d", &n, &m, &d); vector < set < int > > V(n); set < pair < int, int > > S; read_data(n, m, V, S); throw_bad(d, S, V); if(S.size() == 0) { printf("NIE\n"); return 0; } vector < vector < int > > Components; get_components(S, n, V, Components); choose_best_and_print(Components); 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 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include <vector> #include <algorithm> #include <set> #include <unordered_map> using namespace std; void read_data(int n, int m, vector < set <int> > &V, set < pair < int, int > > &S) { for(int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); a--; b--; V[a].insert(b); V[b].insert(a); } for(int i = 0; i < n; i++) if(!V[i].empty()) S.insert(make_pair(V[i].size(), i)); } void throw_bad(int d, set < pair < int, int > > &S, vector < set < int > > &V) { while(!S.empty()) { auto it = S.begin(); int size_ = it->first; int nr = it->second; if(size_ < d) { for(int neigh : V[nr]) { int neigh_size = V[neigh].size(); S.erase(make_pair(neigh_size, neigh)); if(--neigh_size) S.insert(make_pair(neigh_size, neigh)); V[neigh].erase(nr); } V[nr].clear(); S.erase(it); } else break; } } void dfs(int v, vector < set < int > > &V, vector < bool > &Vis, vector < int > &Comp) { Vis[v] = 1; Comp.push_back(v); for(int neigh : V[v]) if(!Vis[neigh]) dfs(neigh, V, Vis, Comp); } void get_components(set < pair < int, int > > &S, int n, vector < set < int > > &V, vector < vector < int > > &Components) { vector < bool > Vis(n, 1); for(pair <int, int> p : S) Vis[p.second] = 0; for(int i = 0; i < n; i++) if(!Vis[i]) { vector < int > Comp; dfs(i, V, Vis, Comp); Components.push_back(Comp); } } void choose_best_and_print(vector < vector < int > > &Components) { vector < int > best = Components[0]; for(vector < int > v : Components) if(v.size() > best.size()) best = v; sort(best.begin(), best.end()); printf("%d\n", best.size()); for(int i = 0; i < best.size(); i++) printf("%d ", best[i] + 1); } int main() { int n, m, d; scanf("%d %d %d", &n, &m, &d); vector < set < int > > V(n); set < pair < int, int > > S; read_data(n, m, V, S); throw_bad(d, S, V); if(S.size() == 0) { printf("NIE\n"); return 0; } vector < vector < int > > Components; get_components(S, n, V, Components); choose_best_and_print(Components); return 0; } |