并查集删除结点,方法是构建虚拟点,做映射。
1 #include2 #include 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