(使用树结构来支持并查集变成8.4.3)UVA 10158 War(并查集的经典题目: 敌友关系)

本文提供了一篇关于 UVA 10158 题目的解题报告,通过并查集算法实现人物之间的朋友和敌对关系的建立与判断。详细介绍了如何使用 C++ 实现这一算法,包括初始化并查集、查找根节点、设置朋友关系、设置敌对关系及判断两人间的关系。
/*
 * UVA_10158_1.cpp
 *
 *  Created on: 2013年11月5日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 10010;

int p[2*maxn];
int n;

int find(int x){
	if(p[x] == x){
		return x;
	}

	return (p[x] = find(p[x]));
}

void setFriends(int x,int y){
	int x1 = find(x);
	int x2 = find(y);
	int y1 = find(x+n);
	int y2 = find(y+n);

	if(x1 == y2 || x2 == y1){
		printf("-1\n");
	}else{
		p[x2] = x1;//将y加入到x的阵营之中
		p[y2] = y1;//将y的敌人加入到x的敌人的阵营之中
	}
}

void setEnemies(int x,int y){
	int x1 = find(x);
	int x2 = find(y);
	int y1 = find(x+n);
	int y2 = find(y+n);

    if(x1 == x2){
    	printf("-1\n");
    }else{
    	p[y1] = x2;//将y将入到x的敌人之中
    	p[y2] = x1;
    }
}


void areFriends(int x,int y){
	if(find(x) == find(y)){
		printf("1\n");
	}else{
		printf("0\n");
	}
}

void areEnemies(int x,int y){
	int x1 = find(x);
	int x2 = find(y);
	int y1 = find(x + n);
	int y2 = find(y + n);

	if(x2 == y1 || x1 == y2){
		printf("1\n");
	}else{
		printf("0\n");
	}
}

int main(){
	scanf("%d",&n);

	int i;
	for(i = 1 ; i <= 2*n ; ++i){
		p[i] = i;
	}

	int c,x,y;
	while(scanf("%d%d%d",&c,&x,&y),c||x||y){
		if(c == 1){
			setFriends(x,y);
		}else if(c == 2){
			setEnemies(x,y);
		}else if(c == 3){
			areFriends(x,y);
		}else if(c == 4){
			areEnemies(x,y);
		}
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值