UVALive 6910 Cutting Tree【並查集】

題目鏈接


/*
    題意:給你含有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;
}

發佈了128 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章