首页 > 代码库 > 【HDOJ】2473 Junk-Mail Filter

【HDOJ】2473 Junk-Mail Filter

并查集删除结点,方法是构建虚拟点,做映射。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define MAXNUM 1000050
 5 
 6 int bin[MAXNUM], assist[MAXNUM];
 7 char visit[MAXNUM];
 8 int n, ext;
 9 
10 int find(int x) {
11     int r = x;
12     int i = x, j;
13 
14     while (r != bin[r])
15         r = bin[r];
16 
17     while (i != r) {
18         j = bin[i];
19         bin[i] = r;
20         i = j;
21     }
22 
23     return r;
24 }
25 
26 void merge(int x, int y) {
27     int fx, fy;
28 
29     fx = find(x);
30     fy = find(y);
31 
32     if (fx != fy) {
33         bin[fx] = fy;
34     }
35 }
36 
37 void extract(int x) {
38     bin[ext] = ext;
39     assist[x] = ext++;
40 }
41 
42 int main() {
43     int m, t=1;
44     int i, x, y;
45     char ch;
46 
47     while (scanf("%d %d", &n, &m)!=EOF && (n||m)) {
48         memset(bin, 0, sizeof(bin));
49         memset(assist, 0, sizeof(assist));
50         memset(visit, 0, sizeof(visit));
51         for (i=0; i<n; ++i) {
52             bin[i] = i;
53             assist[i] = i;
54         }
55         ext = n;
56         while (m--) {
57             scanf("%*c%c", &ch);
58             if (ch == M) {
59                 scanf("%d %d", &x, &y);
60                 x = assist[x];
61                 y = assist[y];
62                 merge(x, y);
63             } else {
64                 scanf("%d", &x);
65                 extract(x);
66             }
67         }
68         m = 0;
69         for (i=0; i<n; ++i) {
70             x = find(assist[i]);
71             if (visit[x] == 0) {
72                 ++m;
73                 visit[x] = 1;
74             }
75         }
76         printf("Case #%d: %d\n", t++, m);
77     }
78 
79     return 0;
80 }