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,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
随机推荐
- UserScan的处理流程分析
UserScan的处理流程分析 前置说明 Userscan是通过client或cp中发起的scanner操作. 在Scan中通过caching属性来返回能够返回多少条数据.每次进行next时. 通过b ...
- Crashing Robots - poj 2632
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8352 Accepted: 3613 Description In ...
- maven 常用的环境插件
<build> <finalName>yycgproject</finalName> <plugins> <!-- 修改jdk插件 --> ...
- mac虚拟机搭建自动化环境-wda和python wda client
尽量升级Xcode到最新版,保持iPhone的版本大于9.3 1.安装webDriverAgent到ios真机 从github上下载代码:git clone https://github.com/fa ...
- IOS下移除按钮默认美化样式
今天在做项目中发现 ios会自己美化按钮的样式 美化的一般都是加一个圆角 也就是常说的border-radius 属性 今天在弄一个input标签的时候加了一个border-bottom属性 ...
- 如何使用subversion管理iOS源代码
本文转载至 http://2009315319.blog.51cto.com/701759/819216 使用subversion管理iOS源代码 1.安装和配置subversion服务器 在wind ...
- (转)如何使VMware ip与本机ip处于同一网段
如何使VMware ip与本机ip处于同一网段 原创 2017年05月08日 17:28:56 1287 首先确认本机ip 可以看出一下信息: 本机ip: 192.168.1.162 网关:192. ...
- 洛谷 1641 [SCOI2010]生成字符串
题目戳这里 一句话题意 求\(C_{m+n}^{m}\)-\(C_{m+n}^{m-1}\) Solution 巨说这个题目很水 标签居然还有字符串? 但是我还不很会用逆元真的太菜了,还好此题模数P为 ...
- 程序运行之ELF 符号表
当一个工程中有多个文件的时候,链接的本质就是要把多个不同的目标文件相互粘到一起.就想玩具积木一样整合成一个整体.为了使不同的目标文件之间能够相互粘合,这些目标文件之间必须要有固定的规则才行.比如目标文 ...
- android 中使用svg
http://www.see-source.com/blog/300000038/1189.html http://www.jianshu.com/p/30dfa5920658#