UVA 10158 War(并查集)
//思路详见课本 P 214 页
思路:直接用并查集,set [ k ] 存 k 的朋友所在集合的代表元素,set [ k + n ] 存 k 的敌人 所在集合的代表元素。
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=2 *10000 +100;
int set[maxn];
int n;
int set_find(int d)
{
if(set[d]<0)
return d;
return set[d]=set_find(set[d]);
}
int arefriends(int x,int y)
{
if( ( set_find(x)!=set_find(y) ) &&( set_find(x)!=set_find(y+n) ) ) // ---------- 不确定关系----- 返回 -1
return -1;
else if(set_find(x)==set_find(y)) // ---------- 是朋友----- 返回 1
return 1;
return 0; //---------- 是敌人----- 返回 0
}
int areenemies(int x,int y)
{
if(arefriends(x,y)==-1) // ---------- 不确定关系----- 返回 -1
return -1;
else if(arefriends(x,y)==1) // ---------- 是朋友----- 返回 0
return 0;
return 1; // ---------- 是敌人----- 返回 1
}
void setfriends(int x,int y)//----------是敌人------输出 -1 {
if(arefriends(x,y)==0)
cout<<-1<<endl;
else if( arefriends(x,y)==-1 )//---当时我把括号写错了 -- -->else if( arefriends(x,y==-1) ),出现了 runtime error
{
set[set_find(x)]=set_find(y);
set[set_find(x+n)]=set_find(y+n);
}
}
void setenemies(int x,int y)
{
if(arefriends(x,y)==1) //---------是朋友----------输出 -1
cout<<-1<<endl;
else if(arefriends(x,y)==-1)
{
set[set_find(x+n)]=set_find(y);
set[set_find(x)]=set_find(y+n);
}
}
int main()
{
memset(set,-1,sizeof(set));
cin>>n; int c,x,y;
while(cin>>c>>x>>y)
{
if(c==0 && x==0 &&y==0)
break;
if(c==1)
setfriends(x,y);
else if(c==2)
setenemies(x,y);
else if(c==3)
cout<< ( arefriends(x,y)==1?1:0 ) <<endl;
else if(c==4)
cout<< ( areenemies(x,y)==1?1:0 ) <<endl;
}
return 0;
}
UVA 10158 War(并查集)的更多相关文章
- UVA - 12232 Exclusive-OR (并查集扩展偏离向量)
Description You are not given n non-negative integersX0,X1,..., Xn-1 less than220, but they do exist ...
- Uva 10158 War
并查集的应用 直接阔成2倍.后N项为对应的敌人 #include <map> #include <set> #include <list> #include < ...
- 紫书 习题 11-12 UVa 1665 (并查集维护联通分量)
这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先 ...
- 紫书 习题11-11 UVa 1644 (并查集)
这道题感觉思路非常巧妙, 我是看了别人的博客才想明白的. 这里用到了并查集, 以根节点为中心城市, 然后把边从大到小排序, 每次的当前的边即为容量, 因为是目前的最小值, 然后去算总的容量, 每次选容 ...
- ZOJ-3261 Connections in Galaxy War 并查集 离线操作
题目链接:https://cn.vjudge.net/problem/ZOJ-3261 题意 有n个星星,之间有m条边 现一边询问与x星连通的最大星的编号,一边拆开一些边 思路 一开始是真不会,甚至想 ...
- ZOJ3261 Connections in Galaxy War 并查集
分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...
- Bond UVA - 11354(并查集按秩合并)
题意: 给你一张无向图,然后有若干组询问,让你输出a->b的最小瓶颈路. 解析: 应该都想过用prime的次小生成树做..但二维数组开不了那么大..所以只能用kruskal了.... #incl ...
- UVA 10158 并查集的经典应用
这个题目一看就是用并查集,有N个国家代表,在M行给出两两之间的关系,敌人或者朋友,(当然如果该关系跟已知关系冲突,则输出-1) 关系的几个约束条件时这样的 在朋友方面,朋友的朋友就是自己的朋友,这个就 ...
- UVA 572 油田连通块-并查集解决
题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
随机推荐
- Ubuntu 16.04下编译安装Apache2.4和PHP7结合
Ubuntu 16.04下编译安装Apache2.4和PHP7结合,并安装PDOmysql扩展. 1.编译安装apache2.4.20 1 第一步: ./configure --prefix=/usr ...
- 【Mac系统 + Mysql】之安装Mysql数据库
安装Mysql步骤: 一.下载 参考文章<mac 安装MySQL> 到Mysql官网下载.dmg格式的文件 先放弃了,看下面的简易安装. 二.使用homebrew安装MySQL(推荐) 如 ...
- shell 获取文件名
1.获取文件名并修改文件名 2.$@ 遍历参数 3.赋值要加"" 4.if 判断注意空格 else后面不能跟then
- java getResourcesAsStream()如何获取WEB-INF下的文件流
getResourcesAsStream()来读取.properties文件,但是getResourcesAsStream()仅在java项目时能获取根目录的文件: 在web项目中,getResour ...
- 【BZOJ4184】shallot 线段树+vector+线性基
[BZOJ4184]shallot Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从 ...
- 九度OJ 1184:二叉树遍历 (二叉树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3515 解决:1400 题目描述: 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的 ...
- iOS设备获取总结
1.获取iOS设备的各种信息 // 这个方法后面会列出来 NSString *deviceName = [self getDeviceName]; NSLog(@"设备型号-->%@& ...
- 【python】-- MySQL简介、安装、操作
MySQL简介.安装.操作 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储 ...
- Django 之 admin组件使用&源码解析
admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 settings.py 中的 INSTALLED ...
- python-安装 pip
https://pip.pypa.io/en/stable/installing/ wget https://bootstrap.pypa.io/get-pip.py python get-pip.p ...