POJ1703 Find them,Catch them

  • 題目大意:已知有兩個團伙,給定一些信息。信息中表示兩人不處於同一團伙。同時有一些詢問,問兩人是否在同一團伙中。

  • 思路:顯然這道題需要使用並查集。但是,似乎並查集並沒有讓兩個元素不處於同一集合中的功能。於是對於給出的x和y,我們可以讓x與y+n處於同一集合,讓y與x+n處於同一集合,這樣便能很好地解決這個問題。

  • 判斷條件:查詢時,若getfa(x)=getfa(y),那麼它們就在同一幫派;若getfa(x)=getfa(y+n)或getfa(x+n)=getfa(y),那麼它們在不同幫派;否則信息不足,無法判定。

  • 注意:我們在讀取字符時,一定要用getchar( )去除回車符。

  • 代碼如下:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100005;
int n,m,t,fa[maxn*2];

int getfa(int x)
{
    if (fa[x]==x)
      return x;
    fa[x]=getfa(fa[x]);
    return fa[x];
}

void unite(int x,int y)
{
    fa[getfa(x)]=getfa(fa[y]);
}

void init()
{
    scanf("%d",&t);
    char ch;
    int x,y,i,j;
    while (t--)
    {
        scanf("%d%d",&n,&m);
        getchar();
        for (i=1;i<=n*2;++i)
          fa[i]=i;
        for (i=1;i<=m;++i)
        {
             scanf("%c%d%d",&ch,&x,&y);
             getchar();
             if (ch=='D')
             {
                 unite(x,y+n);
                 unite(x+n,y);
             }
             else
             {
                 if (getfa(x)==getfa(y))
                   printf("In the same gang.\n");
                 else if (getfa(x)==getfa(y+n) || getfa(x+n)==getfa(y))
                   printf("In different gangs.\n");
                 else 
                   printf("Not sure yet.\n");
             }
        }
    }
}

int main()
{
    init();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章