uva10158(并查集)

题目大意:
场战争在 A 国和 B 国之间开始了。作为一位 C 国的好公民,你决定为你的国家秘密的参加 A 国与 B
// 国之间的和谈。和谈中还有 n 个人,但你不知道他们分别属于哪个国家。你可以看到他们互相交谈,并能通
// 过观察双方在一对一交谈时的表现猜测他们是敌人还是朋友。
//
// 你的国家需要知道某些特定的两个人之间的关系:到底是属于同一国,还是互相敌对,因此需要你在和谈期间
// 接收政府传来的问题,并根据你当前的观察做出回答。
//
// 正式的来说,考虑一个可以进行如下操作的黑盒:
//
// setFriends(x,y) x 和 y 属于同一国家
// setEnemies(x,y) x 和 y 属于不同国家
// areFriends(x,y) 仅当你确信 x 和 y 为朋友时返回 true
// areEnemies(x,y) 仅当你确信 x 和 y 为敌人时返回 false
//
// 若前两种操作与你现有的结论相冲突,你应该报错。“朋友” 关系(符号为 ~)和 “敌对” 关系(符号为 *)
// 具有如下性质:
//
// ~ 是等价关系,即:
// 1. 若 x ~ y 且 y ~ z,则 x ~ z(朋友的朋友也是朋友)
// 2. 若 x ~ y,则 y ~ x(朋友是相互的)
// 3. x ~ x(每个人都是他自己的朋友)
//
// * 满足对称性和反自反性:
// 1. 若 x * y,则 y * x(敌对是相互的)
// 2. x * x 总为假(没有人和自己敌对)
// 3. 若 x * y,且 y * z,则 x ~ z(敌人的敌人是朋友)
// 4. 若 x ~ y,且 y * z,则 x * z(敌人的朋友是敌人)
//
// 操作 setFriends(x,y) 和 setEnemies(x,y) 不能破坏上述性质。

代码:

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <queue>

int f[20001];
int find(int x) {
    while(x != f[x])
        x = f[x];
    return x;
}
int main() {

    int n,c,x,y;
    while(scanf("%d",&n) != EOF) {
        for(int i = 0; i < 2 * n; i++)
            f[i] = i;
        while(scanf("%d%d%d",&c,&x,&y) && c) {
            int a1 = find(x),a2 = find(x + n);
            int b1 = find(y),b2 = find(y + n);
            switch(c) {
            case 1:
                if(a1 == b2)
                    printf("-1\n");
                else {
                    f[a1] = b1;
                    f[a2] = b2;
                }
                break;
            case 2:
                if(a1 == b1 )
                    printf("-1\n");
                else {
                    f[a1] = b2;
                    f[a2] = b1;
                }
                break;
            case 3:
                if(a1 == b1)
                    printf("1\n");
                else
                    printf("0\n");
                break;
            case 4:
                if(a1 == b2)
                    printf("1\n");
                else
                    printf("0\n");
                break;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(uva10158(并查集))