POJ1703 POJ2492 并查集

并查集应用:

POJ1703    Find them, Catch them

题目大意:一个城市有两个帮派(我猜gngs应该差不多就这个意思吧,,不用在意这些细节啦),对于每组输入,D a b 表示a和b属于不同的帮派,A a b问你a和b是否在同一个帮派,对于每次询问,输出相应的结果即可。

分析:说白了,这题就是简化版的食物链。

和食物链的思想一样,我们用a和a+N表示a在哪个集合,这样,对于输入的D a b,我们只需合并a和b+N所在的集合即可。

#include 
#include 
#include 
using namespace std;
#define MAX 100005
int par[2*MAX],rank[2*MAX];
void Init(int n)
{
    for(int i=0;irank[y])
    {
        par[y]=x;
        rank[x]+=rank[y];
    }
    else
    {
        par[x]=y;
        rank[y]+=rank[x];
    }
}
bool Same(int x,int y)
{
    return Find(x)==Find(y);
}
int main()
{
    int n,m,a,b;
    int T=0;
    char w;
    cin>>T;
    while(T--)
    {
        scanf("%d%d",&n,&m);
        Init(2*n);
        while(m--)
        {
            getchar();
            scanf("%c%d%d",&w,&a,&b);
            a-=1;
            b-=1;
            if(w=='A')
            {
                if(Same(a,b+n)) puts("In different gangs.");
                else if(Same(a,b)) puts("In the same gang.");
                else puts("Not sure yet.");
            }
            else
            {
                Union(a,b+n);
                Union(a+n,b);
            }
        }
    }
    return 0;
}


 

POJ2492    A Bug's Life

题目大意:Hopper教授在研究臭虫的性行为,他认为臭虫中只有不同的两性之间才能交配(即他认为臭虫中没有同性恋的存在);然后根据不同的场景,即给出交配的臭虫的编号(从1开始),然后让你判断他的假设是否正确。

这题和上一题几乎一模一样,大致改一下就AC了

#include 
#include 
using namespace std;
#define MAX 2010
int par[2*MAX],rank[2*MAX];
void Init(int n)
{
    for(int i=0;i<=n;i++)
    {
        par[i]=i;
        rank[i]=1;
    }
}
int Find(int x)
{
    if(par[x]!=x)
      return par[x]=Find(par[x]);
    return par[x];
}
void Union(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(rank[x]>rank[y])
    {
        par[y]=x;
        rank[x]+=rank[y];
    }
    else
    {
        par[x]=y;
        rank[y]+=rank[x];
    }
}
int main()
{
    int n,m,t;
    int a,b;
    bool flag;
    int T=1;
    cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        Init(2*n);
        flag=true;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            a-=1;
            b-=1;
            if(Find(a)==Find(b)) flag=false;
            else
            {
                Union(a,b+n);
                Union(a+n,b);
            }
        }
        printf("Scenario #%d:\n",T++);
        if(flag) puts("No suspicious bugs found!\n");
        else puts("Suspicious bugs found!\n");
    }
    return 0;
}


 

你可能感兴趣的:(图论)