/*
題意:給你含有n個節點的森林,和q次操作,每次操作包含兩種情況
1. C a 表示刪除a和父親節點的連邊
2. Q a b 表示詢問a,b節點是否屬於同一個同一棵樹中
類型:並查集
分析:要做到刪邊之後仍然可以找到每棵樹的根,那麼在合併兩個點的時候只
保存父親節點是誰就行了,然後查找的時候,不斷找兩個節點的父親,看
是否存在相等即可
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 20005;
int n,q,fa[maxn];
int Find(int x){
return x==fa[x]?x:x=Find(fa[x]);
}
void unit(int x,int y){
//x=Find(x);
//y=Find(y);
if(x!=y)fa[x]=y;
}
int main()
{
//freopen("D:\\input.txt","r",stdin);
int t;cin>>t;
int x;
for(int ik=1;ik<=t;ik++){
printf("Case #%d:\n",ik);
scanf("%d%d",&n,&q);
for(int i=0;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(x!=0)unit(i,x);
}
for(int i=1;i<=q;i++){
char s[5];int a,b;
scanf("%s",s);
if(s[0]=='C'){
scanf("%d",&a);
fa[a]=a;
}
else{
scanf("%d%d",&a,&b);
if(Find(a)==Find(b))puts("YES");
else puts("NO");
}
}
}
return 0;
}
UVALive 6910 Cutting Tree【並查集】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.