hdu 2473 Junk-Mail Filter 并查集删除

来源:互联网 发布:c语言二进制形式输出 编辑:程序博客网 时间:2024/06/04 19:01
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int N=1000005;int set[N];int a[N];bool vis[N];int find(int x){int r=x;while(r!=set[r]){r=set[r];}int temp=x;while(x!=r){temp=set[x];set[x]=r;x=temp;}return r;}void insert(int x,int y){int fx=find(x);int fy=find(y);if(fx==fy) return;set[fx]=fy;}int main(){int n,m;int Case=1;while(scanf("%d%d",&n,&m)!=EOF){if(!n&&!m) break;for(int i=0;i<n;i++){set[i]=i;a[i]=i;}int r,c;char x;int num=n;char str[2];while(m--){getchar();scanf("%s",&str);if(str[0]=='M'){scanf("%d%d",&r,&c);insert(a[r],a[c]);}else {scanf("%d",&r);set[num]=num;a[r]=num++;}}int cnt=0;memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){int x=find(a[i]);if(!vis[x]){vis[x]=1;cnt++;}}printf("Case #%d: %d\n",Case++,cnt);}return 0;}
并查集的删除:建一个节点取代删除的节点,就是一个新的集合了,建一个数组记录当前值的真实位置,最后查找的也只是值对应真实位置的关系,所以删除的点就不会有影响。
0 0
原创粉丝点击