並查集(刪除節點)
阿新 • • 發佈:2019-02-15
刪除節點,就是把原先的節點設定為虛點,然後把點的位置用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);
}
}