• 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.");
                }
            }
    
        }
    }
  • 相关阅读:
    天心阁漫步
    大美湘江
    easyui tree基本操作
    盗墓笔记
    半年了
    文件上传控件值发生变化后自动提交表单
    宁静的夏夜
    今天您给别人让座,将来别人给您让座
    优先队列priority_queue 用法详解
    POJ2387
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2610245.html
Copyright © 2020-2023  润新知