zoukankan      html  css  js  c++  java
  • 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.");
                }
            }
    
        }
    }
  • 相关阅读:
    css3 练习
    onethink 返回上一页
    小程序之轮播图
    Node 基本使用
    IDEA Terminal
    Spring Shell简单应用
    Spring Theme简单应用
    Spring MVC的学习笔记
    Win10出现键盘未失灵,按下的键都是快捷键的问题
    SQL Server 添加描述
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2610245.html
Copyright © 2011-2022 走看看