#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; } |