#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;
}
并查集的删除:建一个节点取代删除的节点,就是一个新的集合了,建一个数组记录当前值的真实位置,最后查找的也只是值对应真实位置的关系,所以删除的点就不会有影响。
hdu 2473 Junk-Mail Filter 并查集删除
最新推荐文章于 2019-09-27 19:57:38 发布