poj1073--Find them, Catch them(并查集应用)

Find them, Catch them

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 32073   Accepted: 9890

Description

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.

Source

POJ Monthly--2004.07.18

题目大意,给出n个人m个操作,A操作问两个人是不是在同一个集合里,D操作代表两个人不在一个集合里。

开一个数组d,d[i] = j,代表i所属的集合和j的集合对立,用并查集不断更新它就可以了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 110000
int c[maxn] , d[maxn] ;
int find1(int x)
{
    if( c[x] != x )
    {
        c[x] = find1(c[x]) ;
        d[x] = d[ c[x] ] ;
    }
    return c[x] ;
}
int main()
{
    int t , n , m , i , j ;
    char str[10] ;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d %d", &n, &m);
        for(i = 1 ; i <= n ; i++)
            c[i] = i ;
        memset(d,-1,sizeof(d));
        while(m--)
        {
            int a , b , x , y , xx , yy ;
            scanf("%s %d %d", str, &a, &b);
            x = find1(a) ;
            y = find1(b) ;
            if( str[0] == 'D' )
            {
                if(d[x] == -1 && d[y] == -1)
                {
                    d[a] = b ; d[b] = a ;
                }
                else
                {
                    if( d[x] != -1 )
                    {
                        if( d[y] != -1 )
                        {
                            xx = d[y] ;
                            xx = find1(xx) ;
                            c[xx] = x ;
                            d[xx] = d[x] ;
                        }
                        c[y] = d[x] ;
                        d[y] = x ;

                    }
                    else
                    {
                        if( d[x] != -1 )
                        {
                            yy = d[x] ;
                            yy = find1(yy) ;
                            c[yy] = y ;
                            d[yy] = d[y] ;
                        }
                        c[x] = d[y] ;
                        d[x] = y ;
                    }
                }
            }
            else
            {
                if( x == y )
                    printf("In the same gang.\n");
                else if( d[x] == -1 || d[y] == -1 || d[x] != y || d[y] != x  )
                    printf("Not sure yet.\n");
                else if( d[x] == y || d[y] != x )
                    printf("In different gangs.\n");

            }
        }
    }
    return 0;
}
时间: 2024-11-05 12:11:10

poj1073--Find them, Catch them(并查集应用)的相关文章

POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y均能C通信,则x和y可以通信.现在给出若干个操作, O p 代表修复编号为p的电脑 S p q代表询问p和q是不是能通信. 思路: 并查集即可.. 如果修复了一台电脑,则把与它相连距离不超过d的且修复了的放在一个集合里面. #include<cstdio> #include<cstring&

POJ 1703 Find them, catch them (并查集)

题目:Find them,Catch them 刚开始以为是最基本的并查集,无限超时. 这个特殊之处,就是可能有多个集合. 比如输入D 1 2  D 3 4 D 5 6...这就至少有3个集合了.并且任意2个集合之间成员的敌我关系不明. 这里每个集合里面的成员关系要记录,他们在一个集合里,只是因为他们关系明确,敌人或者朋友. 千万不要简单的认为成朋友在一个集合,敌人在另外一个集合,分成2个集合.因为题目说只有2个匪帮,很容易进入这个误区. 我们只要记录一个成员和自己父亲的敌我关系和建树就可以了.

poj1703(Find them, Catch them)并查集

Description 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

北大ACM1703——Find them, Catch them~~并查集

题目的意思是:在一个城市,有两个犯罪团伙.输入N(人的个数)和M(信息的个数).后面M条信息是一个字母加上两个数字i和j,如果字母为D,则说明i和j属于不同的犯罪团伙,如果字母是A,则要你判断i和j的关系,属于同一个还是属于不同的还是不确定. 一开始,觉得这个题目计较棘手,属于D的情况下,是属于不同的犯罪团伙,不知道如何来解决. 后来想到了之前看到的一题,POJ1182食物链,判断有多少条信息是错的.有三个并查集来判断动物的关系. 所以这一题,我们可以用两个并查集来判断.N最大为10^5,所以并

POJ1703 Find them, Catch them 并查集 好题 有坑点

Description 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

POJ No1703 Find them, Catch them 并查集

题目链接:http://poj.org/problem?id=1703 题意:两个坏蛋属于不同的组织,给出两个坏蛋判定是否一个组织. 题解:已知每次输入的两个帮派人员 x, y; 合并 (x, y + N), (x + N, y).判定时,如果 (x, y) 属于同一个 根,就是同一个组织,(x, y+N) 属于同一个根,则说明是不同组织.不确定则无解. #include <iostream> using namespace std; const int maxn = 100000*2 + 2

POJ 1703 Find them, Catch them(带权并查集)

传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accepted: 13065 Description 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 D

POJ 1703 Find them, Catch them(数据结构-并查集)

Find them, Catch them Description 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 b

POJ 1703 Find them, Catch them (数据结构-并查集)

Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31102   Accepted: 9583 Description 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