hdu2473 Junk-Mail Filter(並查集,造假點)
阿新 • • 發佈:2018-12-13
題目
題意:
個操作,每個操作可以把
合併再一個集合,也可以把
從它當前集合中刪去,成為孤立的點,求最後的不同集合數量
Solution
如果真要從並查集裡刪一個數,那肯定是很麻煩的,而且我也不會,但是可以把 留著,以後不再呼叫 ,把之後的呼叫 都改成呼叫 ,其實就相當於刪掉了
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1100002;
int n,m,i,fa[N],id[N],cnt,x,y,rx,ry,cas;
set<int>S;
char s[2];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
while (~scanf("%d%d",&n,&m) && n){
cnt=n;
for (i=0;i<n+m;i++) fa[i]=i;
for (i=0;i<n;i++) id[i]=i;
for (;m--;){
scanf("%s%d",s,&x);
if (s[0]=='M'){
scanf("%d",&y);
rx=find(id[x]),ry=find(id[y]);
if (rx!=ry) fa[rx]=ry;
}else id[x]=cnt++;
}
S.clear();
for (i=0;i<n;i++) S.insert(find(id[i]));
printf("Case #%d: %d\n",++cas,S.size());
}
}