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.");
                }
            }
    
        }
    }
  • 相关阅读:
    JSDeferred 源码分析
    前端MVVM框架avalon揭秘
    前端MVVM框架avalon揭秘
    轻量级前端MVVM框架avalon源码分析-总结
    JavaScript 中介者模式与观察者模式有何不同?
    Knockout 新版应用开发教程之"text"绑定
    Knockout 新版应用开发教程之"visible"绑定
    Knockout 新版应用开发教程之Observable Arrays
    设计模式之美:Decorator(装饰)
    设计模式之美:Composite(组合)
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2610245.html
Copyright © 2011-2022 走看看