#include <cstdio>
#include <list>
#include <map>
#include <set>
using namespace std;
int n, m, d;
int st[200001];;
set<int> pol[200001];
list <int> ud; // under 'd', mniej niz d-polaczen
int on_ud[200001]; // on ud list, do not push again
int bfs(int v, int & cur, list<int>&c)
{
cur = 0;
c.clear();
cur++;
st[v]=0;
c.push_back(v);
list<int>::iterator it = c.begin();
// c - list w spojnej skladowej
for (; it != c.end(); ++it)
{
for (set<int>::iterator iter = pol[*it].begin();
iter != pol[*it].end(); ++iter)
{
if (st[*iter]==0) // juz jest na liscie
continue;
pol[*iter].erase(*it);
c.push_back(*iter);
st[*iter] = 0; // jest na liscie
cur++;
}
}
return 0;
}
int main()
{
scanf("%d %d %d", &n, &m, &d);
int b,e;
for (int i =0 ; i < m; i++)
{
scanf("%d %d", &b, &e);
st[b]++;
st[e]++;
pol[b].insert(e);
pol[e].insert(b);
}
for (int i = 1; i <= n; i++)
{
if (st[i] < d)
{
st[i] = 0;
on_ud[i] = 1;
for (set<int>::iterator it=pol[i].begin();it != pol[i].end(); ++it)
{
st[*it]--;
pol[*it].erase(i);
if (st[*it] < d)
{
ud.push_back(*it);
on_ud[*it] = 1;
}
}
}
}
for (list<int>::iterator it = ud.begin(); it != ud.end(); ++it)
{
for (set<int>::iterator its=pol[*it].begin();its != pol[*it].end(); ++its)
{
st[*its]--;
pol[*its].erase(*it);
if (st[*its] < d && ! on_ud[*its])
{
ud.push_back(*its);
on_ud[*its] = 1;
}
}
}
// zostalu tylko st[i] >= d
list<int> c, m;
int cur=0, max = 0; // curr=c.size(); max=m.size()
for (int i = 1; i <=n ; i++)
{
if (st[i] >= d)
{
bfs(i, cur, c);
if (cur > max)
{
max = cur;
m = c;
}
}
}
if (max < d)
{
printf("NIE");
return 0;
}
printf("%d\n", max);
m.sort();
for (list<int>::iterator it=m.begin();it != m.end(); ++it)
{
printf("%d ", *it);
}
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 104 105 106 107 108 109 110 111 | #include <cstdio> #include <list> #include <map> #include <set> using namespace std; int n, m, d; int st[200001];; set<int> pol[200001]; list <int> ud; // under 'd', mniej niz d-polaczen int on_ud[200001]; // on ud list, do not push again int bfs(int v, int & cur, list<int>&c) { cur = 0; c.clear(); cur++; st[v]=0; c.push_back(v); list<int>::iterator it = c.begin(); // c - list w spojnej skladowej for (; it != c.end(); ++it) { for (set<int>::iterator iter = pol[*it].begin(); iter != pol[*it].end(); ++iter) { if (st[*iter]==0) // juz jest na liscie continue; pol[*iter].erase(*it); c.push_back(*iter); st[*iter] = 0; // jest na liscie cur++; } } return 0; } int main() { scanf("%d %d %d", &n, &m, &d); int b,e; for (int i =0 ; i < m; i++) { scanf("%d %d", &b, &e); st[b]++; st[e]++; pol[b].insert(e); pol[e].insert(b); } for (int i = 1; i <= n; i++) { if (st[i] < d) { st[i] = 0; on_ud[i] = 1; for (set<int>::iterator it=pol[i].begin();it != pol[i].end(); ++it) { st[*it]--; pol[*it].erase(i); if (st[*it] < d) { ud.push_back(*it); on_ud[*it] = 1; } } } } for (list<int>::iterator it = ud.begin(); it != ud.end(); ++it) { for (set<int>::iterator its=pol[*it].begin();its != pol[*it].end(); ++its) { st[*its]--; pol[*its].erase(*it); if (st[*its] < d && ! on_ud[*its]) { ud.push_back(*its); on_ud[*its] = 1; } } } // zostalu tylko st[i] >= d list<int> c, m; int cur=0, max = 0; // curr=c.size(); max=m.size() for (int i = 1; i <=n ; i++) { if (st[i] >= d) { bfs(i, cur, c); if (cur > max) { max = cur; m = c; } } } if (max < d) { printf("NIE"); return 0; } printf("%d\n", max); m.sort(); for (list<int>::iterator it=m.begin();it != m.end(); ++it) { printf("%d ", *it); } return 0; } |
English