#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>graf[200005];
int tab[200005],d;
bool odw[200005], odw2[200005];
void usun(int w){
if (tab[w]<d){
odw[w]=true;
tab[w]=0;
int n=graf[w].size();
for (int i = 0; i < n; i++){
if(!odw[graf[w][i]]){
tab[graf[w][i]]--;
if(tab[graf[w][i]]<d){
usun(graf[w][i]);
}
}
}
}
}
int dfs (int w, int l){
odw2[w] = true;
int n = graf[w].size();
int MAX = l;
for (int i = 0; i < n; i++){
if (!odw2[graf[w][i]]&&!odw[graf[w][i]]){
MAX = max (l, dfs(graf[w][i], l+1));
}
}
return MAX;
}
vector <int> wynik;
bool odw3[200005];
void dfs2 (int w){
odw3[w] = true;
wynik.push_back(w);
int n = graf[w].size();
for (int i = 0; i < n; i++){
if (!odw3[graf[w][i]]&&!odw[graf[w][i]]){
odw3[graf[w][i]] = true;
dfs2 (graf[w][i]);
}
}
}
int main(){
int n, m, a, b, pom, MAX=0, pom2=0;
scanf("%d%d%d", &n, &m, &d);
for (int i = 0; i < m; i++){
scanf("%d%d", &a, &b);
graf[a].push_back(b);
graf[b].push_back(a);
tab[a]++;
tab[b]++;
// printf("%d ", i);
}
// printf("s");
for(int i = 0; i <= n; i++){
if (tab[i]<d&&!odw[i]){
usun(i);
}
}
for (int i = 1; i <= n; i++){
if (!odw2[i]&&!odw[i]){
pom = dfs(i, 1);
if(pom>MAX){
MAX=pom;
pom2=i;
}
}
}
if (MAX == 0){
printf("NIE");
return 0;
}
//printf("%d\n", MAX);
dfs2 (pom2);
sort (wynik.begin(), wynik.end());
pom = wynik.size();
printf("%d\n", pom);
for (int i = 0; i < pom; i++) printf("%d ", wynik[i]);
//for(int i = 0; i <= n; i++)printf("%d %d\n", i, tab[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 | #include<cstdio> #include<vector> #include<algorithm> using namespace std; vector<int>graf[200005]; int tab[200005],d; bool odw[200005], odw2[200005]; void usun(int w){ if (tab[w]<d){ odw[w]=true; tab[w]=0; int n=graf[w].size(); for (int i = 0; i < n; i++){ if(!odw[graf[w][i]]){ tab[graf[w][i]]--; if(tab[graf[w][i]]<d){ usun(graf[w][i]); } } } } } int dfs (int w, int l){ odw2[w] = true; int n = graf[w].size(); int MAX = l; for (int i = 0; i < n; i++){ if (!odw2[graf[w][i]]&&!odw[graf[w][i]]){ MAX = max (l, dfs(graf[w][i], l+1)); } } return MAX; } vector <int> wynik; bool odw3[200005]; void dfs2 (int w){ odw3[w] = true; wynik.push_back(w); int n = graf[w].size(); for (int i = 0; i < n; i++){ if (!odw3[graf[w][i]]&&!odw[graf[w][i]]){ odw3[graf[w][i]] = true; dfs2 (graf[w][i]); } } } int main(){ int n, m, a, b, pom, MAX=0, pom2=0; scanf("%d%d%d", &n, &m, &d); for (int i = 0; i < m; i++){ scanf("%d%d", &a, &b); graf[a].push_back(b); graf[b].push_back(a); tab[a]++; tab[b]++; // printf("%d ", i); } // printf("s"); for(int i = 0; i <= n; i++){ if (tab[i]<d&&!odw[i]){ usun(i); } } for (int i = 1; i <= n; i++){ if (!odw2[i]&&!odw[i]){ pom = dfs(i, 1); if(pom>MAX){ MAX=pom; pom2=i; } } } if (MAX == 0){ printf("NIE"); return 0; } //printf("%d\n", MAX); dfs2 (pom2); sort (wynik.begin(), wynik.end()); pom = wynik.size(); printf("%d\n", pom); for (int i = 0; i < pom; i++) printf("%d ", wynik[i]); //for(int i = 0; i <= n; i++)printf("%d %d\n", i, tab[i]); } |
English