#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int miasta;
int drogi;
int d;
int a, b;
vector<int> sasiad[200005];
int wielkosc[200005];
bool visited[200005];
bool visited2[200005];
queue<int> doodjebki;
int gorny;
int aktual;
int aktorg[200005];
int wynik;
int wynorg[200005];
int dfs(int miasto)
{
visited2[miasto] = true;
aktorg[aktual] = miasto;
aktual++;
for(int i=0; i<sasiad[miasto].size(); i++)
{
if(visited2[sasiad[miasto][i]] == false && visited[sasiad[miasto][i]] == false)
dfs(sasiad[miasto][i]);
}
}
int main()
{
scanf("%d%d%d",&miasta,&drogi,&d);
for(int i=0; i<drogi; i++)
{
scanf("%d%d",&a,&b);
sasiad[a].push_back(b);
wielkosc[a]++;
sasiad[b].push_back(a);
wielkosc[b]++;
}
for(int i=1; i<=miasta; i++) // usuniecie niepasujacych miast
{
if(wielkosc[i] < d)
{
doodjebki.push(i);
visited[i] = true;
}
}
while(!doodjebki.empty())
{
gorny = doodjebki.front();
doodjebki.pop();
for(int i=0; i<sasiad[gorny].size(); i++)
{
wielkosc[sasiad[gorny][i]]--;
if(wielkosc[sasiad[gorny][i]] < d && visited[sasiad[gorny][i]] == false)
{
doodjebki.push(sasiad[gorny][i]);
visited[sasiad[gorny][i]] = true;
}
}
}
for(int i=1; i<=miasta; i++) // znalezienie najlepszego rozwiazania
{
if(visited2[i] == false && visited[i] == false)
{
for(int j=0; j<aktual; j++)
aktorg[j] = 0;
aktual = 0;
dfs(i);
if(aktual > wynik)
{
for(int j=0; j<aktual; j++)
wynorg[j] = aktorg[j];
wynik = aktual;
}
}
}
if(wynik == 0)
printf("NIE");
else
{
sort(wynorg,wynorg+wynik);
printf("%d\n",wynik);
for(int i=0; i<wynik; i++)
printf("%d ",wynorg[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 | #include<cstdio> #include<vector> #include<queue> #include<algorithm> using namespace std; int miasta; int drogi; int d; int a, b; vector<int> sasiad[200005]; int wielkosc[200005]; bool visited[200005]; bool visited2[200005]; queue<int> doodjebki; int gorny; int aktual; int aktorg[200005]; int wynik; int wynorg[200005]; int dfs(int miasto) { visited2[miasto] = true; aktorg[aktual] = miasto; aktual++; for(int i=0; i<sasiad[miasto].size(); i++) { if(visited2[sasiad[miasto][i]] == false && visited[sasiad[miasto][i]] == false) dfs(sasiad[miasto][i]); } } int main() { scanf("%d%d%d",&miasta,&drogi,&d); for(int i=0; i<drogi; i++) { scanf("%d%d",&a,&b); sasiad[a].push_back(b); wielkosc[a]++; sasiad[b].push_back(a); wielkosc[b]++; } for(int i=1; i<=miasta; i++) // usuniecie niepasujacych miast { if(wielkosc[i] < d) { doodjebki.push(i); visited[i] = true; } } while(!doodjebki.empty()) { gorny = doodjebki.front(); doodjebki.pop(); for(int i=0; i<sasiad[gorny].size(); i++) { wielkosc[sasiad[gorny][i]]--; if(wielkosc[sasiad[gorny][i]] < d && visited[sasiad[gorny][i]] == false) { doodjebki.push(sasiad[gorny][i]); visited[sasiad[gorny][i]] = true; } } } for(int i=1; i<=miasta; i++) // znalezienie najlepszego rozwiazania { if(visited2[i] == false && visited[i] == false) { for(int j=0; j<aktual; j++) aktorg[j] = 0; aktual = 0; dfs(i); if(aktual > wynik) { for(int j=0; j<aktual; j++) wynorg[j] = aktorg[j]; wynik = aktual; } } } if(wynik == 0) printf("NIE"); else { sort(wynorg,wynorg+wynik); printf("%d\n",wynik); for(int i=0; i<wynik; i++) printf("%d ",wynorg[i]); } return 0; } |
polski