zoukankan      html  css  js  c++  java
  • Find them, Catch them(种类并查集)

    The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and Gang Snake. However, the police first needs to identify which gang a criminal belongs to. The present question is, given two criminals; do they belong to a same clan? You must give your judgment based on incomplete information. (Since the gangsters are always acting secretly.)

    Assume N (N <= 10^5) criminals are currently in Tadu City, numbered from 1 to N. And of course, at least one of them belongs to Gang Dragon, and the same for Gang Snake. You will be given M (M <= 10^5) messages in sequence, which are in the following two kinds:

    1. D [a] [b]
    where [a] and [b] are the numbers of two criminals, and they belong to different gangs.

    2. A [a] [b]
    where [a] and [b] are the numbers of two criminals. This requires you to decide whether a and b belong to a same gang.

    Input

    The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. Each test case begins with a line with two integers N and M, followed by M lines each containing one message as described above.

    Output

    For each message "A [a] [b]" in each case, your program should give the judgment based on the information got before. The answers might be one of "In the same gang.", "In different gangs." and "Not sure yet."

    Sample Input

    1
    5 5
    A 1 2
    D 1 2
    A 1 2
    D 2 4
    A 1 4
    

    Sample Output

    Not sure yet.
    In different gangs.
    In the same gang.
    
    思路:这道题用到的是食物链的思想,以(x+n)代表敌对关系
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    typedef long long ll;
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e6;
    int sign[maxn];
    int n, m, t;
    void init()
    {
        for(int i = 0; i<maxn; i++)
            sign[i] = i;
    }
    int get(int x)
    {
        if(x == sign[x])
            return x;
        return sign[x] = get(sign[x]);
    }
    void unio(int x, int y)//合并敌对关系
    {
        int a = get(x), b = get(y);
        sign[a] = b;
    }
    int cmp1(int x, int y)//判断两个人是不在同一个帮派
    {
        if(get(x) == get(y+n) || get(y) == get(x+n))//如果两者为敌对关系,则返回1
            return 1;
        return 0;
    }
    int cmp2(int x, int y)//判断两人在同一个帮派
    {
        if(get(x) == get(y) || get(x+n) == get(y+n))//如果两个人不是敌对关系
            return 1;
        return 0;
    }
    int main()
    {
        char bang;
        int a, b;
        scanf("%d", &t);
        for(int i = 0; i<t; i++)
        {
            init();
            scanf("%d%d", &n, &m);
            for(int j = 0; j<m; j++)
            {
                scanf("%s%d%d",&bang,&a,&b);
                if(bang == 'D')
                {
                    unio(a, b + n);
                    unio(a + n,b);
                }
                else if(bang == 'A')
                {
                    if(cmp1(a, b))//如果不在同一个帮派
                        printf("In different gangs.
    ");
                    else if(cmp2(a,b))//如果在同一个帮派
                        printf("In the same gang.
    ");
                    else//搜索不到
                        printf("Not sure yet.
    ");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    window 删除文件提示指定的文件名无效或太长
    glib-2.40编译安装
    《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习
    Kotlin中when表达式的使用:超强的switch(KAD 13)
    Kotlin将Realm提升到更高层次
    Kotlin中的“忍者”函数 —— 理解泛型的能力(KAD 12)
    Kotlin中功能操作与集合(KAD 11)
    Kotlin的数据类:节省很多行代码(KAD 10)
    在Android中用Kotlin的Anko运行后台任务(KAD 09)
    Kotlin的扩展函数:扩展Android框架(KAD 08)
  • 原文地址:https://www.cnblogs.com/RootVount/p/10539618.html
Copyright © 2011-2022 走看看