#include <stdio.h> #include <string.h> #define N 100001 #define M 1000001 int par[N+M+50]; int repplace[N+50]; int flag[N+M]; int ind; void init(int n ) { for(int i=0;i<n;i++) { par[i]=i; repplace[i]=i; } ind =n; } int findset(int n) { if(n==par[n]) return n; else return par[n]=findset(par[n]); } void unite(int n,int m) { int pn=findset(n); int pm=findset(m); if(pn!=pm) par[pn]=pm; } void Delete(int n)//删除操作, { repplace[n]=ind; par[ind]=ind; ind++; } int main() { int a,b; char s[3]; int x,y; int cas=0; while(scanf("%d%d",&a,&b)==2)//我一直纠结为什莫会WA,判断输入的控制条件错了 { if(a==0&&b==0) break; init(a); for(int i=0;i<b;i++) { scanf("%s",s); if(s[0]=='M') { scanf("%d%d",&x,&y); unite(repplace[x],repplace[y]); } else { scanf("%d",&x); Delete(x); } } memset(flag,0,sizeof(flag)); int ans=0; for(int i=0;i<a;i++)//判断他们有几个集合 { int hh=findset(repplace[i]); if(!flag[hh]) { flag[hh]=1; ans++; } } printf("Case #%d: %d\n",++cas,ans); } }其它就不做介绍了,只要会并查集的一般能看懂看懂,看不懂可评论,或发私信。。。。。。
Hdu 2473(并查集删除操作) Junk-Mail Filter,布布扣,bubuko.com
Hdu 2473(并查集删除操作) Junk-Mail Filter
原文地址:http://blog.csdn.net/u013076044/article/details/38540933