#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]); }*/ } |
English