UVA10158 - War(並查集)

UVA10158 - War(並查集)

題目鏈接

題目大意:有n個國家,每個國家有友國和敵國,並且遵守着朋友的朋友是朋友,敵人的敵人是朋友的原則,給你四種操作,題目中有描述,然後讓你根據操作進行,對應輸出相應的結果。

解題思路:題目裏面有敵對關係和朋友關係,朋友的關係可以使用並查集,但是敵對的關係是不行的。轉化敵對的關係。假設0~n - 1,代表國家。n~2 * n - 1 代表0~n - 1這些國家的敵國。例如 1 和 4是敵對關係,因爲敵人的敵人是朋友,那麼1 + n 和 4 與 1 和4 + n就是朋友的關係,將敵對的關係轉換成朋友的關係,然後朋友的關係就可以用並差集了(朋友具有傳遞的關係)。

代碼:


#include <cstdio>
#include <cstring>

const int maxn = 10005;
int N;
int p[maxn * 2];

void init () {

    for (int i = 0; i < 2 * N; i++)
        p[i] = i;       
}

int getParent(int x) {
    return x == p[x] ? x : p[x] = getParent(p[x]); 
}

bool setfriend (int x, int y) {

    int  x1 = getParent(x);
    int  y1 = getParent(y);
    int  x2 = getParent(x + N);
    int  y2 = getParent(y + N);

    if (x1 == y2 || y1 == x2)
        return false;
    else {

        p[x1] = y1;
        p[x2] = y2;
        return true;
    }
}

bool setenemies(int x, int y ) {

    int  x1 = getParent(x);
    int  y1 = getParent(y);
    int  x2 = getParent(x + N);
    int  y2 = getParent(y + N);

    if (x1 == y1 || y2 == x2)
        return false;
    else {

        p[x1] = y2;
        p[y1] = x2;
        return true;
    }
}

bool is_friend(int x, int y) {

    int  x1 = getParent(x);
    int  y1 = getParent(y);
    int  x2 = getParent(x + N);
    int  y2 = getParent(y + N);

    if (x1 == y1)
        return true;
    return false;   
}

bool is_enemies(int x, int y) {

    int  x1 = getParent(x);
    int  y1 = getParent(y);
    int  x2 = getParent(x + N);
    int  y2 = getParent(y + N);

    if (x1 == y2 || x2 == y1)
        return true;
    return false;   
}

int main () {

    int op, x, y;

    scanf ("%d", &N);
    init();

    while (scanf ("%d%d%d", &op, &x, &y) != EOF && (op || x || y)) {

        if (op == 1) {
            if (setfriend(x, y) == false)
                printf("-1\n");
        } else if (op == 2) {
            if (setenemies(x, y) == false)
                printf ("-1\n");
        } else if (op == 3)
            printf ("%d\n", is_friend(x, y));
        else 
            printf ("%d\n", is_enemies(x, y));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章