#include <stdio.h>
#include <set>
#include <queue>
#define MAX 200000
using namespace std;
int n, m, d, a, b, edgeCount[MAX + 1], edgeRemove[MAX + 1], x, vertexs, count, v;
set<int>::iterator it;
set<int> edge[MAX + 1];
queue<int> toRemove;
bool visited[MAX + 1];
inline void selectTree()
{
queue<int> lol;
for (int i=1; i<=n; ++i)
if (edgeCount[i] - edgeRemove[i] > 0)
{
lol.push(i);
break;
}
while (!lol.empty())
{
v = lol.front();
visited[v] = true;
for (it=edge[v].begin(); it!=edge[v].end(); ++it)
if (!visited[*it])
lol.push(*it);
lol.pop();
}
}
int main()
{
scanf("%d %d %d", &n, &m, &d);
for (int i=0; i<m; ++i)
{
scanf("%d %d", &a, &b);
edge[a].insert(b);
edge[b].insert(a);
edgeCount[a]++;
edgeCount[b]++;
}
for (int i=1; i<=n; ++i)
{
vertexs = edgeCount[i] - edgeRemove[i];
if (vertexs < d && 0 < vertexs)
toRemove.push(i);
}
while (!toRemove.empty())
{
v = toRemove.front();
for (it=edge[v].begin(); it!=edge[v].end(); ++it)
{
x = *it;
edge[x].erase(v);
edgeRemove[x]++;
vertexs = edgeCount[x] - edgeRemove[x];
if (vertexs < d && 0 < vertexs)
toRemove.push(x);
}
edge[v].clear();
edgeRemove[v] = edgeCount[v];
toRemove.pop();
}
selectTree();
for (int i=1; i<=n; ++i)
{
if (visited[i])
count++;
}
if (count != 0)
{
printf("%d\n", count);
for (int i=1; i<=n; ++i)
if (visited[i])
printf("%d ", i);
printf("\n");
}
else
printf("NIE\n");
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 | #include <stdio.h> #include <set> #include <queue> #define MAX 200000 using namespace std; int n, m, d, a, b, edgeCount[MAX + 1], edgeRemove[MAX + 1], x, vertexs, count, v; set<int>::iterator it; set<int> edge[MAX + 1]; queue<int> toRemove; bool visited[MAX + 1]; inline void selectTree() { queue<int> lol; for (int i=1; i<=n; ++i) if (edgeCount[i] - edgeRemove[i] > 0) { lol.push(i); break; } while (!lol.empty()) { v = lol.front(); visited[v] = true; for (it=edge[v].begin(); it!=edge[v].end(); ++it) if (!visited[*it]) lol.push(*it); lol.pop(); } } int main() { scanf("%d %d %d", &n, &m, &d); for (int i=0; i<m; ++i) { scanf("%d %d", &a, &b); edge[a].insert(b); edge[b].insert(a); edgeCount[a]++; edgeCount[b]++; } for (int i=1; i<=n; ++i) { vertexs = edgeCount[i] - edgeRemove[i]; if (vertexs < d && 0 < vertexs) toRemove.push(i); } while (!toRemove.empty()) { v = toRemove.front(); for (it=edge[v].begin(); it!=edge[v].end(); ++it) { x = *it; edge[x].erase(v); edgeRemove[x]++; vertexs = edgeCount[x] - edgeRemove[x]; if (vertexs < d && 0 < vertexs) toRemove.push(x); } edge[v].clear(); edgeRemove[v] = edgeCount[v]; toRemove.pop(); } selectTree(); for (int i=1; i<=n; ++i) { if (visited[i]) count++; } if (count != 0) { printf("%d\n", count); for (int i=1; i<=n; ++i) if (visited[i]) printf("%d ", i); printf("\n"); } else printf("NIE\n"); return 0; } |
English