/*
* 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;
}
(使用树结构来支持并查集变成8.4.3)UVA 10158 War(并查集的经典题目: 敌友关系)
最新推荐文章于 2025-04-23 21:35:55 发布
本文提供了一篇关于 UVA 10158 题目的解题报告,通过并查集算法实现人物之间的朋友和敌对关系的建立与判断。详细介绍了如何使用 C++ 实现这一算法,包括初始化并查集、查找根节点、设置朋友关系、设置敌对关系及判断两人间的关系。

3772

被折叠的 条评论
为什么被折叠?



