HDU 2473 Junk-Mail Filter(并查集的删除操作)
生活随笔
收集整理的這篇文章主要介紹了
HDU 2473 Junk-Mail Filter(并查集的删除操作)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目地址:HDU 2473
這題曾經碰到過,沒做出來。
。如今又做了做,還是沒做出來。
。、、
這題涉及到并查集的刪除操作。想到了設一個虛節點,可是我把虛節點設為了要刪除的點的父節點。一直是棧溢出,目測是無限遞歸了。
看了看別人的做法。 原來僅僅要建一個映射就能夠了,虛節點是作為的新的映射,每次刪除一個點,就把他映射到一個新的點上去。
代碼例如以下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm>using namespace std; int bin[2100000], _hash[2100000], d[2100000]; int find1(int x) {return bin[x]==d[x]?d[x]:bin[x]=find1(bin[x]); } void join(int x, int y) {int f1=find1(x);int f2=find1(y);if(f1!=f2)bin[f2]=f1; } int main() {int n, m, i, cnt, num=0, sum, a, b;char c;while(scanf("%d%d",&n,&m)!=EOF&&n+m){num++;sum=0;cnt=n;for(i=0; i<2000000; i++){bin[i]=i;d[i]=i;}while(m--){getchar();scanf("%c",&c);if(c=='M'){scanf("%d%d",&a,&b);join(a,b);}else{scanf("%d",&a);bin[a]=cnt;d[a]=cnt++;}}memset(_hash,0,sizeof(_hash));for(i=0; i<n; i++){a=find1(d[i]);if(!_hash[a]){sum++;_hash[a]=1;}//printf("%d ",a);}//puts("");printf("Case #%d: %d\n",num,sum);}return 0; }
轉載于:https://www.cnblogs.com/lxjshuju/p/7220359.html
總結
以上是生活随笔為你收集整理的HDU 2473 Junk-Mail Filter(并查集的删除操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3436 ACM Compute
- 下一篇: HTML5 Canvas爱心时钟代码