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