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;
}
UVA10158 - War(并查集)相关推荐
- uva 10158 - War(并查集)
题目链接:10158 - War 题目大意:有n个人,若干个命令,每个人分属于不同的国家,并且代表国家与其他代表会谈,这将决定国与国之间的同盟关系,1:a与b结盟 2:a与b决裂(成为敌人) 3:判 ...
- UVA 10158 War 并查集
第一次自己写并差集一次ac,纪念一下 #include<iostream> #include<algorithm> #include<cstdio> #includ ...
- UVa10158 War(并查集)
这道题是并查集的应用,很好的题型 思路我也是参照别人的思路,不过思路很简单的 题中说了很多很复杂的关于朋友还是敌人的东西,其实你读透了就会发现,其实就是一句话,如果你是我的朋友的朋友,那么我们就有公共 ...
- [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...
- POJ 并查集 题目汇总 ——czyuan原创(转)
继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码: ...
- 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈
题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...
- HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集
题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...
- POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树
一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...
最新文章
- ORACLE SQL:经典查询练手第二篇
- 11.6 mpstat:CPU信息统计
- 视频光端机使用、保养与维护方法详解
- android一些若干回调测试
- HTTPs 相关的东西
- ikbc机械键盘打字出现重复_机械键盘轴体你最爱谁?ikbc新品键盘评测:我爱红轴,不解释!...
- C#中lock关键字的用法
- 东莞市理工学校计算机分数线,东莞公办中职学校分数线公布,理工学校两专业613分领跑全市...
- 智能控制在计算机领域的应用,智能控制的主要应用领域
- 西门子与源讯联手打造网络安全技术;全球首个5G全息国际通话打通 | IoT黑板报...
- 刚毕业一个月,7 月正式入职深圳互联网公司的前端月度工作汇报 |总结
- 第八章 云计算原理与技术
- LeetCode第714题解析
- c ||和,if判断语句
- 在opensuse上安装TL-WDN5200免驱版无线网卡
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
- 云从MGN《Learning Discriminative Features with Multiple Granularities for Person Re-Identification》论文阅读
- Opencv中flip函数讲解
- Windows网络重置常用指令(根据自己使用情况不定期更新)
- windows 下 c++ 快速截屏
热门文章
- 启动Tomcat服务器报错:Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost are alrea
- Linux进阶 | 2万字总结最详细的Docker的安装、底层隔离机制和简单使用!建议收藏,持续更新❤
- 抑郁症:从自毁到重生,可能你只差一个它
- 实习第五天 工作总结
- 感动!刘若英和陈升的那些往事
- 二极管的三种击穿形式
- BTC EmbeddedPlatform安装手记
- EasyUI TreeGrid各行调整上下位置
- 2008中国IC十佳(七):深圳芯邦冲刺创业板
- java中国象棋兵吃棋规则_中国象棋吃子的规则