#include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; const int mxn = 200010; bool czy_istnieje[mxn]; vector <int> tab[mxn]; int ile_krawedzi[mxn]; vector <int> spojne_skladowe[mxn]; bool visited[mxn]; int n, m, d; void BFS(int a) { queue <int> q; q.push(a); while(!q.empty()) { int x = q.front(); q.pop(); czy_istnieje[x] = 1; for(int i = 0 ; i < tab[x].size() ; i++) { int y = tab[x][i]; ile_krawedzi[y]--; if(czy_istnieje[y] == 0 && ile_krawedzi[y] < d) { q.push(y); } } } } void DFS(int a, int b) { visited[a] = 1; spojne_skladowe[b].push_back(a); for(int i = 0 ; i < tab[a].size() ; i++) { int x = tab[a][i]; if(czy_istnieje[x] == 0 && visited[x] == 0) { return DFS(x, b); } } } int main() { int a, b; scanf("%d%d%d", &n, &m, &d); for(int i = 0 ; i < m ; i++) { scanf("%d%d", &a, &b); tab[a].push_back(b); tab[b].push_back(a); ile_krawedzi[a]++; ile_krawedzi[b]++; } while(1) { for(int i = 1 ; i <= n ; i++) { if(ile_krawedzi[i] < d && czy_istnieje[i] == 0) BFS(i); } bool czy = 1; for(int i = 1 ; i <= n ; i++) { if(ile_krawedzi[i] < d && czy_istnieje[i] == 0) { czy = 0; break; } } if(czy == 1) break; } int nr = 0; for(int i = 1 ; i <= n ; i++) { if(czy_istnieje[i] == 0 && visited[i] == 0) { DFS(i, nr); nr++; } } int mx = 0; for(int i = 0 ; i < nr ; i++) { int sz = spojne_skladowe[i].size(); mx = max(mx, sz); /* printf("%d: ", i); for(int j = 0 ; j < spojne_skladowe[i].size() ; j++) { printf("%d ", spojne_skladowe[i][j]); } printf("\n");*/ } if(mx == 0) { printf("NIE\n"); } for(int i = 0 ; i < nr ; i++) { if(spojne_skladowe[i].size() == mx) { printf("%d\n", mx); for(int j = 0 ; j < mx ; j++) { printf("%d ", spojne_skladowe[i][j]); } return 0; } } /* for(int i = 1 ; i <= n ; i++) { printf("%d: %d\n", i, czy_istnieje[i]); }*/ }
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 | #include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; const int mxn = 200010; bool czy_istnieje[mxn]; vector <int> tab[mxn]; int ile_krawedzi[mxn]; vector <int> spojne_skladowe[mxn]; bool visited[mxn]; int n, m, d; void BFS(int a) { queue <int> q; q.push(a); while(!q.empty()) { int x = q.front(); q.pop(); czy_istnieje[x] = 1; for(int i = 0 ; i < tab[x].size() ; i++) { int y = tab[x][i]; ile_krawedzi[y]--; if(czy_istnieje[y] == 0 && ile_krawedzi[y] < d) { q.push(y); } } } } void DFS(int a, int b) { visited[a] = 1; spojne_skladowe[b].push_back(a); for(int i = 0 ; i < tab[a].size() ; i++) { int x = tab[a][i]; if(czy_istnieje[x] == 0 && visited[x] == 0) { return DFS(x, b); } } } int main() { int a, b; scanf("%d%d%d", &n, &m, &d); for(int i = 0 ; i < m ; i++) { scanf("%d%d", &a, &b); tab[a].push_back(b); tab[b].push_back(a); ile_krawedzi[a]++; ile_krawedzi[b]++; } while(1) { for(int i = 1 ; i <= n ; i++) { if(ile_krawedzi[i] < d && czy_istnieje[i] == 0) BFS(i); } bool czy = 1; for(int i = 1 ; i <= n ; i++) { if(ile_krawedzi[i] < d && czy_istnieje[i] == 0) { czy = 0; break; } } if(czy == 1) break; } int nr = 0; for(int i = 1 ; i <= n ; i++) { if(czy_istnieje[i] == 0 && visited[i] == 0) { DFS(i, nr); nr++; } } int mx = 0; for(int i = 0 ; i < nr ; i++) { int sz = spojne_skladowe[i].size(); mx = max(mx, sz); /* printf("%d: ", i); for(int j = 0 ; j < spojne_skladowe[i].size() ; j++) { printf("%d ", spojne_skladowe[i][j]); } printf("\n");*/ } if(mx == 0) { printf("NIE\n"); } for(int i = 0 ; i < nr ; i++) { if(spojne_skladowe[i].size() == mx) { printf("%d\n", mx); for(int j = 0 ; j < mx ; j++) { printf("%d ", spojne_skladowe[i][j]); } return 0; } } /* for(int i = 1 ; i <= n ; i++) { printf("%d: %d\n", i, czy_istnieje[i]); }*/ } |