#include <cstdio> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxN = 500000; vector <int> G[maxN + 1], res_vertices; bool vis[maxN + 1], banned[maxN + 1]; int limit, current_component_size, state[maxN + 1]; queue <int> Q; void kinda_top_sort() { while (!Q.empty()) { int v = Q.front(); Q.pop(); for (int i=0; i<G[v].size(); i++) { int u = G[v][i]; if (banned[u]) continue; state[u]--; if (state[u] >= limit) continue; banned[u] = 1; Q.push(u); } } } void dfs(int v, bool flag) { if (flag) res_vertices.push_back(v); else current_component_size++ ; vis[v] = 1; for (int i=0; i<G[v].size(); i++) { int u = G[v][i]; if (banned[u] or vis[u]) continue; dfs(u, flag); } } int main() { int n, m; scanf ("%d%d%d", &n, &m, &limit); while (m--) { int a, b; scanf ("%d%d", &a, &b); G[a].push_back(b); G[b].push_back(a); } for (int i=1; i<=n; i++) { state[i] = G[i].size(); if (state[i] >= limit) continue; banned[i] = 1; Q.push(i); } kinda_top_sort(); int res_component_size = 0, res_main_vertex = 0; for (int i=1; i<=n; i++) { if (banned[i] or vis[i]) continue; dfs(i, 0); if (res_component_size < current_component_size) { res_component_size = current_component_size; res_main_vertex = i; } current_component_size = 0; } if (res_component_size == 0) { printf("NIE\n"); return 0; } fill (vis + 1, vis + 1 + n, 0); dfs(res_main_vertex, 1); sort(res_vertices.begin(), res_vertices.end()); printf("%d\n", res_component_size); for (int i=0; i<res_component_size; i++) printf("%d ", res_vertices[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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <cstdio> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxN = 500000; vector <int> G[maxN + 1], res_vertices; bool vis[maxN + 1], banned[maxN + 1]; int limit, current_component_size, state[maxN + 1]; queue <int> Q; void kinda_top_sort() { while (!Q.empty()) { int v = Q.front(); Q.pop(); for (int i=0; i<G[v].size(); i++) { int u = G[v][i]; if (banned[u]) continue; state[u]--; if (state[u] >= limit) continue; banned[u] = 1; Q.push(u); } } } void dfs(int v, bool flag) { if (flag) res_vertices.push_back(v); else current_component_size++ ; vis[v] = 1; for (int i=0; i<G[v].size(); i++) { int u = G[v][i]; if (banned[u] or vis[u]) continue; dfs(u, flag); } } int main() { int n, m; scanf ("%d%d%d", &n, &m, &limit); while (m--) { int a, b; scanf ("%d%d", &a, &b); G[a].push_back(b); G[b].push_back(a); } for (int i=1; i<=n; i++) { state[i] = G[i].size(); if (state[i] >= limit) continue; banned[i] = 1; Q.push(i); } kinda_top_sort(); int res_component_size = 0, res_main_vertex = 0; for (int i=1; i<=n; i++) { if (banned[i] or vis[i]) continue; dfs(i, 0); if (res_component_size < current_component_size) { res_component_size = current_component_size; res_main_vertex = i; } current_component_size = 0; } if (res_component_size == 0) { printf("NIE\n"); return 0; } fill (vis + 1, vis + 1 + n, 0); dfs(res_main_vertex, 1); sort(res_vertices.begin(), res_vertices.end()); printf("%d\n", res_component_size); for (int i=0; i<res_component_size; i++) printf("%d ", res_vertices[i]); return 0; } |