POJ 1703 Find them, Catch them 利用并查集的长度关系(我现在不敢说是不是距离了)

这道题根同性恋那道题相当像无非就是看他有没有合并过、记录合并之后的那个点的关系罢了。
View Code
//AC代码1

#include <stdio.h>
 #include <stdlib.h>
 int set[100005],num[100006],h[100005];
 int find(int x)
 {
     if(x!=set[x])
     {
         int y = set[x];
         set[x] = find(set[x]);
         num[x] = (num[x]+num[y])%2;//一定要写这个%2不知道为什么不加%2他就wa加上就ac我郁闷了好久,可能是会超限吧。。。
     }
     return set[x];
 }
 void merge(int x, int y)
 {
     int a = find(x);
     int b = find(y);
     if(a!= b)
     {
         if(h[a]>h[b])
         {
             set[b] = a;
             num[b] = (num[x]-num[y]+1)%2;//别忘了加啊
         }
         else
         {
             set[a] = b;
             num[a] = (num[y]-num[x]+1)%2;
             if(h[a] == h[b])
             h[b]++;
         }
     }
 }
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,n,m,a,b;
        char order[5];
        scanf("%d %d",&n,&m);
        for(i = 0;i <= n;i++)
        {
            set[i] = i;
            h[i] = 0;
            num[i] = 0;
        }
        while(m--)
        {
            scanf("%s",order);
            scanf("%d %d",&a,&b);
            if(order[0] == 'D')
                merge(a,b);
            else
            {
                if(find(a) == find(b))
                {
                    if(num[a]%2 != num[b]%2)
                    puts("In different gangs.");
                    else
                    puts("In the same gang.");
                }
                else
                puts("Not sure yet.");
            }
        }

    }
}
View Code
#include <stdio.h>
 #include <stdlib.h>
 int set[100005],num[100006],h[100005];
 int find(int x)
 {
     if(x!=set[x])
     {
         int y = set[x];
         set[x] = find(set[x]);
         num[x] = (num[x]+num[y])%2;
     }
     return set[x];
 }
 void merge(int x, int y)
 {
     int a = find(x);
     int b = find(y);
     if(a!= b)
     {
         if(h[a]>h[b])
         {
             set[b] = a;
             num[b] = (num[x]-num[y]+1)%2;
         }
         else
         {
             set[a] = b;
             num[a] = (num[y]-num[x]+1)%2;
             if(h[a] == h[b])
             h[b]++;
         }
     }
 }
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,n,m,a,b;
        char order[5];
        scanf("%d %d",&n,&m);
        for(i = 0;i <= n;i++)
        {
            set[i] = i;
            h[i] = 0;
            num[i] = 0;
        }
        while(m--)
        {
            scanf("%s",order);
            scanf("%d %d",&a,&b);
            if(order[0] == 'D')
                merge(a,b);
            else
            {
                if(find(a) == find(b))
                {
                    if(num[a]%2 != num[b]%2)
                    puts("In different gangs.");
                    else
                    puts("In the same gang.");
                }
                else
                puts("Not sure yet.");
            }
        }

    }
}
posted @ 2012-07-26 16:06  某某。  阅读(184)  评论(0编辑  收藏  举报