1. 程式人生 > >WHU403 可刪除並查集

WHU403 可刪除並查集

ring using break har 出現 sca for printf 我們

我們記錄一下每個元素的編號pid[]
刪除時,將刪除的點編號變為一個先前未出現的值,fa等於他自己

#include<cstdio>
#include<cstring>
#define MAXN 2000000+9
using namespace std;

int fa[MAXN],pid[MAXN];
int n,ans1,ans2;

int Find(int x){
    return fa[x]==x ? x : fa[x]=Find(fa[x]);
}

void merge(int x,int y){
    int xx=Find(x);
    int yy=Find(y);
    fa[xx]=yy;
}

int
main(){ while(scanf("%d",&n)!=EOF){ ans1=ans2=0; int i; for(i=0;i<=n;i++){ fa[i]=i; pid[i]=i; } while(true){ char opt[2]; int x,y; scanf("%s",opt); if(opt[0]==‘e‘) break
; if(opt[0]==‘c‘){ scanf("%d%d",&x,&y); x=pid[x]; y=pid[y]; merge(x,y); } if(opt[0]==‘d‘){ scanf("%d",&x); pid[x]=++n; fa[n]=n; } if
(opt[0]==‘q‘){ scanf("%d%d",&x,&y); x=pid[x]; y=pid[y]; int xx=Find(x); int yy=Find(y); if(xx==yy) ans1++; else ans2++; } } printf("%d , %d\n",ans1,ans2); } return 0; }

WHU403 可刪除並查集