poj 1703 Find them, Catch them (並查集)

鏈接:poj 1703

題意:在這個城市裏有2個黑幫團伙,現在給出N個人,M條信息

輸入D x y代表x於y不在一個團伙裏
輸入A x y要輸出x與y是否在同一團伙或者不確定他們在同一個團伙裏

分析:雖說是並查集的題,但又有所不同,

本題給出的信息爲x,y不在一個團伙,而並查集確定的是關於有關係的操作

假設x與x+N不在一個團伙,y與y+N不在一個團伙,又x與y不在一個團伙,

一共只有2個黑幫團伙,所以x與y+N在一個團伙,y與x+N在一個團伙,

這樣就可以將無關係的信息,轉化爲有關係,再用並查集即可,

但是若x與y不在一個相同的團伙,得確定他們關係無法確定還是確定不在一個團伙

同理可以判斷x與y+N的關係和y與x+N的關係即可


#include<stdio.h>
#define M 200000
int f[M+5];
int find(int x)
{
    if(x!=f[x])
        f[x]=find(f[x]);
    return f[x];
}
void mix(int a,int b)
{
    a=find(a);
    b=find(b);
    if(a!=b)
        f[a]=b;
}
int judge(int a,int b)
{
    a=find(a);
    b=find(b);
    if(a!=b)
        return 0;
    return 1;
}
int main()
{
    int T,n,m,i,a,b;
    char c;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        getchar();
        for(i=1;i<=n*2;i++)
            f[i]=i;
        for(i=1;i<=m;i++){
            scanf("%c%d%d",&c,&a,&b);
            getchar();
            if(c=='D'){
                mix(a,b+n);  //a與b+n在一個團伙
                mix(b,a+n);  //b與a+n在一個團伙

            }
            else if(c=='A'){
                if(judge(a,b))
                    printf("In the same gang.\n");
                else if(judge(a,b+n)||judge(b,a+n))  //若不在同一團伙,得判斷是否無法確定關係
                    printf("In different gangs.\n");
                else
                    printf("Not sure yet.\n");
            }
        }
    }
    return 0;
}

poj 2492 也是同樣的題型,直接改改輸入輸出就ok

鏈接:poj 2492

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