/* 2015 * Maciej Szeptuch * II UWr */ #include <cstdio> #include <vector> int biggest, cities, component[262144], count[262144], density, roads, start, end, weight[262144]; bool disabled[262144]; std::vector<int> disable, graph[262144]; int markComponent(int c, const int i); int main(void) { scanf("%d %d %d", &cities, &roads, &density); for(int r = 0; r < roads; ++ r) { scanf("%d %d", &start, &end); -- start, -- end; ++ weight[start]; ++ weight[end]; graph[start].push_back(end); graph[end].push_back(start); } for(int c = 0; c < cities; ++ c) if(weight[c] < density) { disable.push_back(c); disabled[c] = true; } while(!disable.empty()) { int cur = disable.back(); disable.pop_back(); for(unsigned int n = 0; n < graph[cur].size(); ++ n) { -- weight[graph[cur][n]]; if(!disabled[graph[cur][n]] && weight[graph[cur][n]] < density) { disable.push_back(graph[cur][n]); disabled[graph[cur][n]] = true; } } } for(int c = 0, i = 1; c < cities; ++ c) { if(disabled[c]) continue; if(component[c]) continue; count[i] = markComponent(c, i); if(count[i] > count[biggest]) biggest = i; ++ i; } if(!biggest && count[biggest] < density) puts("NIE"); else { printf("%d\n", count[biggest]); for(int c = 0; c < cities; ++ c) if(component[c] == biggest) printf("%d ", c + 1); puts(""); } return 0; } int markComponent(int c, const int i) { int result = 0; std::vector<int> stack; stack.push_back(c); component[c] = i; while(!stack.empty()) { ++ result; int cur = stack.back(); stack.pop_back(); for(unsigned int n = 0; n < graph[cur].size(); ++ n) { int &next = graph[cur][n]; if(!disabled[next] && !component[next]) { component[next] = i; stack.push_back(next); } } } return result; }
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 | /* 2015 * Maciej Szeptuch * II UWr */ #include <cstdio> #include <vector> int biggest, cities, component[262144], count[262144], density, roads, start, end, weight[262144]; bool disabled[262144]; std::vector<int> disable, graph[262144]; int markComponent(int c, const int i); int main(void) { scanf("%d %d %d", &cities, &roads, &density); for(int r = 0; r < roads; ++ r) { scanf("%d %d", &start, &end); -- start, -- end; ++ weight[start]; ++ weight[end]; graph[start].push_back(end); graph[end].push_back(start); } for(int c = 0; c < cities; ++ c) if(weight[c] < density) { disable.push_back(c); disabled[c] = true; } while(!disable.empty()) { int cur = disable.back(); disable.pop_back(); for(unsigned int n = 0; n < graph[cur].size(); ++ n) { -- weight[graph[cur][n]]; if(!disabled[graph[cur][n]] && weight[graph[cur][n]] < density) { disable.push_back(graph[cur][n]); disabled[graph[cur][n]] = true; } } } for(int c = 0, i = 1; c < cities; ++ c) { if(disabled[c]) continue; if(component[c]) continue; count[i] = markComponent(c, i); if(count[i] > count[biggest]) biggest = i; ++ i; } if(!biggest && count[biggest] < density) puts("NIE"); else { printf("%d\n", count[biggest]); for(int c = 0; c < cities; ++ c) if(component[c] == biggest) printf("%d ", c + 1); puts(""); } return 0; } int markComponent(int c, const int i) { int result = 0; std::vector<int> stack; stack.push_back(c); component[c] = i; while(!stack.empty()) { ++ result; int cur = stack.back(); stack.pop_back(); for(unsigned int n = 0; n < graph[cur].size(); ++ n) { int &next = graph[cur][n]; if(!disabled[next] && !component[next]) { component[next] = i; stack.push_back(next); } } } return result; } |