#include <cstdio>
#include <vector>
#include <algorithm>
#define FOREACH(i, n) for(int i=0;i<n;i++)
#define SIZE 200000
using namespace std;
int d;
vector <int> *G;
int Usuniete[SIZE]={0};
bool Przetworzony[SIZE];
//przy przechodzeniu grafu sprawdzic czy przetwarzany wierzcholek nie zostal usuniety
//funkcja wykonujaca warunek (1)
void sprawdz(int m){//m - id wezla
if(!Przetworzony[m] && G[m].size()-Usuniete[m] < d){
Przetworzony[m]=true;
FOREACH(i, G[m].size()){
Usuniete[G[m].at(i)]++;
sprawdz(G[m].at(i));
}
}
}
//funkcja wykonujaca warunek (2)
void przetworz(vector <int> *wynik, int node){
if(!Przetworzony[node]){
Przetworzony[node]=true;
wynik->push_back(node+1);
FOREACH(i, G[node].size()) przetworz(wynik, G[node].at(i));
}
}
int main(){
int n, m;
int a, b;
int max=0;
vector <vector <int> > Wynik;
vector <int> temp;
scanf("%d%d%d", &n, &m, &d);
G = new vector <int> [n];
FOREACH(i, m){
scanf("%d%d", &a, &b);
a--;
b--;
G[a].push_back(b);
G[b].push_back(a);
}
FOREACH(i, n) sprawdz(i);
FOREACH(i, n) if(!Przetworzony[i]){
Wynik.push_back(temp);
przetworz(&Wynik.at(Wynik.size()-1), i);
}
FOREACH(i, Wynik.size()) if(Wynik[max].size() < Wynik[i].size()) max=i;
if(Wynik.size() > 0){
sort(Wynik[max].begin(), Wynik[max].end());
printf("%lu\n", Wynik[max].size());
FOREACH(i, Wynik[max].size()-1) printf("%d ", Wynik[max].at(i));
printf("%d", Wynik[max].at(Wynik[max].size()-1));
}else printf("NIE");
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 | #include <cstdio> #include <vector> #include <algorithm> #define FOREACH(i, n) for(int i=0;i<n;i++) #define SIZE 200000 using namespace std; int d; vector <int> *G; int Usuniete[SIZE]={0}; bool Przetworzony[SIZE]; //przy przechodzeniu grafu sprawdzic czy przetwarzany wierzcholek nie zostal usuniety //funkcja wykonujaca warunek (1) void sprawdz(int m){//m - id wezla if(!Przetworzony[m] && G[m].size()-Usuniete[m] < d){ Przetworzony[m]=true; FOREACH(i, G[m].size()){ Usuniete[G[m].at(i)]++; sprawdz(G[m].at(i)); } } } //funkcja wykonujaca warunek (2) void przetworz(vector <int> *wynik, int node){ if(!Przetworzony[node]){ Przetworzony[node]=true; wynik->push_back(node+1); FOREACH(i, G[node].size()) przetworz(wynik, G[node].at(i)); } } int main(){ int n, m; int a, b; int max=0; vector <vector <int> > Wynik; vector <int> temp; scanf("%d%d%d", &n, &m, &d); G = new vector <int> [n]; FOREACH(i, m){ scanf("%d%d", &a, &b); a--; b--; G[a].push_back(b); G[b].push_back(a); } FOREACH(i, n) sprawdz(i); FOREACH(i, n) if(!Przetworzony[i]){ Wynik.push_back(temp); przetworz(&Wynik.at(Wynik.size()-1), i); } FOREACH(i, Wynik.size()) if(Wynik[max].size() < Wynik[i].size()) max=i; if(Wynik.size() > 0){ sort(Wynik[max].begin(), Wynik[max].end()); printf("%lu\n", Wynik[max].size()); FOREACH(i, Wynik[max].size()-1) printf("%d ", Wynik[max].at(i)); printf("%d", Wynik[max].at(Wynik[max].size()-1)); }else printf("NIE"); return 0; } |
English