#include <stdio.h>
#include <stdlib.h>
int n, m, d;
struct node {
int num;
};
struct list {
struct list *next;
struct node *node;
};
struct list_head {
struct list *list;
int count;
};
struct node nodes[200000+1];
struct list_head adj[200000+1];
struct list * list_add_front(struct list_head *head, struct node *node)
{
struct list *newl = malloc(sizeof(*newl));
struct list *old = head->list;
newl->next = old ? old : 0;
newl->node = node;
head->list = newl;
head->count++;
return newl;
}
void delete(int num, struct node *node)
{
struct list_head *head = &adj[num];
struct list *e = head->list, *prev;
for (prev = 0; e; prev = e, e = e->next) {
if (e->node == node) {
if (prev) {
prev->next = e->next;
} else {
head->list = e->next;
}
head->count -= 1;
return;
}
}
}
int main(int argc, char *argv[])
{
int i;
int changed;
scanf("%d %d %d", &n, &m, &d );
for (i = 1; i <= n; i++)
nodes[i].num = i;
for (i = 0; i < m; i++) {
int from, to;
scanf("%d %d", &from, &to);
list_add_front(&adj[from], &nodes[to]);
list_add_front(&adj[to], &nodes[from]);
}
/*
for (i = 1; i <= n; i++) {
if (adj[i].count < d) {
printf("dropping node %d: adj %d < d %d\n", i, adj[i].count, d);
}
}
*/
do {
changed = 0;
for (i = 1; i <= n; i++) {
if (adj[i].count > 0 && adj[i].count < d) {
struct list *e1;
for (e1 = adj[i].list; e1; e1 = e1->next) {
delete(e1->node->num, &nodes[i]);
changed = 1;
}
adj[i].count = 0;
}
}
} while (changed);
changed = 0;
for (i = 1; i <= n; i++) {
if (adj[i].count >= d) {
// printf("%d ", i);
changed++;
}
}
if (!changed)
printf("NIE\n");
else {
printf("%d\n", changed);
for (i = 1; i <= n; i++) {
if (adj[i].count >= d) {
printf("%d ", i);
}
}
printf("\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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <stdio.h> #include <stdlib.h> int n, m, d; struct node { int num; }; struct list { struct list *next; struct node *node; }; struct list_head { struct list *list; int count; }; struct node nodes[200000+1]; struct list_head adj[200000+1]; struct list * list_add_front(struct list_head *head, struct node *node) { struct list *newl = malloc(sizeof(*newl)); struct list *old = head->list; newl->next = old ? old : 0; newl->node = node; head->list = newl; head->count++; return newl; } void delete(int num, struct node *node) { struct list_head *head = &adj[num]; struct list *e = head->list, *prev; for (prev = 0; e; prev = e, e = e->next) { if (e->node == node) { if (prev) { prev->next = e->next; } else { head->list = e->next; } head->count -= 1; return; } } } int main(int argc, char *argv[]) { int i; int changed; scanf("%d %d %d", &n, &m, &d ); for (i = 1; i <= n; i++) nodes[i].num = i; for (i = 0; i < m; i++) { int from, to; scanf("%d %d", &from, &to); list_add_front(&adj[from], &nodes[to]); list_add_front(&adj[to], &nodes[from]); } /* for (i = 1; i <= n; i++) { if (adj[i].count < d) { printf("dropping node %d: adj %d < d %d\n", i, adj[i].count, d); } } */ do { changed = 0; for (i = 1; i <= n; i++) { if (adj[i].count > 0 && adj[i].count < d) { struct list *e1; for (e1 = adj[i].list; e1; e1 = e1->next) { delete(e1->node->num, &nodes[i]); changed = 1; } adj[i].count = 0; } } } while (changed); changed = 0; for (i = 1; i <= n; i++) { if (adj[i].count >= d) { // printf("%d ", i); changed++; } } if (!changed) printf("NIE\n"); else { printf("%d\n", changed); for (i = 1; i <= n; i++) { if (adj[i].count >= d) { printf("%d ", i); } } printf("\n"); } return 0; } |
English