1. 程式人生 > >並查集(刪除節點)

並查集(刪除節點)

刪除節點,就是把原先的節點設定為虛點,然後把點的位置用num陣列指向新的位置。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<set>
using namespace std;
typedef long long ll;
int num[10005],fa[300005];
int _find(int x)
{
    if(fa[x]!=x)
        fa[x]=_find(fa[x]);
    return fa[x];
}
int
main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) fa[i]=i,num[i]=i; int cnt=n; char ch[2]; int n1=0,n2=0,a,b; while(scanf("%s",ch)) { if(ch[0]=='e') break; if(ch[0]=='c') { scanf
("%d%d",&a,&b); int aa=_find(num[a]),bb=_find(num[b]); if(aa!=bb) fa[bb]=aa; } else if(ch[0]=='q') { scanf("%d%d",&a,&b); if(_find(num[a])==_find(num[b])) n1++; else n2++; } else
{ scanf("%d",&a); num[a]=++cnt; fa[num[a]]=num[a]; } } printf("%d , %d\n",n1,n2); } }