#include <stdio.h> typedef struct SEdge SEdge; struct SEdge{ int v; SEdge *next; }; SEdge *node[200004], data[400008]; int deg[200004], heap[200004], pos[200004]; int visi[200004], T[200004]; void merge(int *t, int p, int q, int v){ int i = p, j = q + 1; while (!(i > v)){ T[i] = t[i]; i++; } i = p; while ( !(p > q) && !(j > v) ){ if(deg[T[p]] < deg[T[j]]){ pos[T[p]] = i; t[i++] = T[p++]; } else{ pos[T[j]] = i; t[i++] = T[j++]; } } while ( !(p > q) ){ pos[T[p]] = i; t[i++] = T[p++]; } } void mergeSort(int *t, int p, int v){ if (p < v){ int q = (p + v)>>1; mergeSort(t, p, q); mergeSort(t, q+1, v); merge(t, p, q, v); } } int DFS(int v, int l){ SEdge *tmp; int n = 0, L = 0; heap[L++] = v; while(L){ v = heap[--L]; if(!visi[v]){ visi[v] = l; n++; tmp = node[v]; while(tmp){ if(pos[tmp->v] && !visi[tmp->v]) heap[L++] = tmp->v; tmp = tmp->next; } } } return n; } int main() { SEdge *tmp; int n, m, d, a, b, t = 0, i, j, k; scanf("%d%d%d",&n,&m,&d); for(i = 1; i <= n; i++) pos[i] = heap[i] = i; while(m--){ scanf("%d%d",&a,&b); data[t].v = b; data[t].next = node[a]; node[a] = &data[t++]; data[t].v = a; data[t].next = node[b]; node[b] = &data[t++]; deg[a]++; deg[b]++; } m = n; mergeSort(heap, 1, m); while(m > 0 && deg[heap[1]] < d){ i = heap[1]; j = 2, k = heap[m--]; while(j <= m){ if(j^m && deg[heap[j+1]] < deg[heap[j]]) j++; if(deg[k] <= deg[heap[j]]) break; heap[j>>1] = heap[j]; pos[heap[j]] = j>>1; j <<= 1; } heap[j>>1] = k; pos[k] = j>>1; pos[i] = 0; tmp = node[i]; while(tmp){ if( pos[tmp->v] ){ deg[tmp->v]--; j = pos[tmp->v], k = heap[j]; while(j > 1 && deg[heap[j>>1]] > deg[k]){ heap[j] = heap[j>>1]; pos[heap[j]] = j; j >>= 1; } heap[j] = k; pos[k] = j; } tmp=tmp->next; } } t = b = m = 0; for(i = 1; i <= n; i++){ if(pos[i] && !visi[i]){ j = DFS(i,++t); if(j > m){ b = t; m = j; } } } if(t > 0){ printf("%d\n",m); for(i = 1; i <= n; i++){ if(visi[i] == b) printf("%d ",i); } } else printf("NIE\n"); 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 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #include <stdio.h> typedef struct SEdge SEdge; struct SEdge{ int v; SEdge *next; }; SEdge *node[200004], data[400008]; int deg[200004], heap[200004], pos[200004]; int visi[200004], T[200004]; void merge(int *t, int p, int q, int v){ int i = p, j = q + 1; while (!(i > v)){ T[i] = t[i]; i++; } i = p; while ( !(p > q) && !(j > v) ){ if(deg[T[p]] < deg[T[j]]){ pos[T[p]] = i; t[i++] = T[p++]; } else{ pos[T[j]] = i; t[i++] = T[j++]; } } while ( !(p > q) ){ pos[T[p]] = i; t[i++] = T[p++]; } } void mergeSort(int *t, int p, int v){ if (p < v){ int q = (p + v)>>1; mergeSort(t, p, q); mergeSort(t, q+1, v); merge(t, p, q, v); } } int DFS(int v, int l){ SEdge *tmp; int n = 0, L = 0; heap[L++] = v; while(L){ v = heap[--L]; if(!visi[v]){ visi[v] = l; n++; tmp = node[v]; while(tmp){ if(pos[tmp->v] && !visi[tmp->v]) heap[L++] = tmp->v; tmp = tmp->next; } } } return n; } int main() { SEdge *tmp; int n, m, d, a, b, t = 0, i, j, k; scanf("%d%d%d",&n,&m,&d); for(i = 1; i <= n; i++) pos[i] = heap[i] = i; while(m--){ scanf("%d%d",&a,&b); data[t].v = b; data[t].next = node[a]; node[a] = &data[t++]; data[t].v = a; data[t].next = node[b]; node[b] = &data[t++]; deg[a]++; deg[b]++; } m = n; mergeSort(heap, 1, m); while(m > 0 && deg[heap[1]] < d){ i = heap[1]; j = 2, k = heap[m--]; while(j <= m){ if(j^m && deg[heap[j+1]] < deg[heap[j]]) j++; if(deg[k] <= deg[heap[j]]) break; heap[j>>1] = heap[j]; pos[heap[j]] = j>>1; j <<= 1; } heap[j>>1] = k; pos[k] = j>>1; pos[i] = 0; tmp = node[i]; while(tmp){ if( pos[tmp->v] ){ deg[tmp->v]--; j = pos[tmp->v], k = heap[j]; while(j > 1 && deg[heap[j>>1]] > deg[k]){ heap[j] = heap[j>>1]; pos[heap[j]] = j; j >>= 1; } heap[j] = k; pos[k] = j; } tmp=tmp->next; } } t = b = m = 0; for(i = 1; i <= n; i++){ if(pos[i] && !visi[i]){ j = DFS(i,++t); if(j > m){ b = t; m = j; } } } if(t > 0){ printf("%d\n",m); for(i = 1; i <= n; i++){ if(visi[i] == b) printf("%d ",i); } } else printf("NIE\n"); return 0; } |