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