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(并查集)相关推荐

  1. uva 10158 - War(并查集)

    题目链接:10158 - War 题目大意:有n个人,若干个命令,每个人分属于不同的国家,并且代表国家与其他代表会谈,这将决定国与国之间的同盟关系,1:a与b结盟  2:a与b决裂(成为敌人) 3:判 ...

  2. UVA 10158 War 并查集

    第一次自己写并差集一次ac,纪念一下 #include<iostream> #include<algorithm> #include<cstdio> #includ ...

  3. UVa10158 War(并查集)

    这道题是并查集的应用,很好的题型 思路我也是参照别人的思路,不过思路很简单的 题中说了很多很复杂的关于朋友还是敌人的东西,其实你读透了就会发现,其实就是一句话,如果你是我的朋友的朋友,那么我们就有公共 ...

  4. [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...

  5. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  6. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  7. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  8. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  9. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

最新文章

  1. ORACLE SQL:经典查询练手第二篇
  2. 11.6 mpstat:CPU信息统计
  3. 视频光端机使用、保养与维护方法详解
  4. android一些若干回调测试
  5. HTTPs 相关的东西
  6. ikbc机械键盘打字出现重复_机械键盘轴体你最爱谁?ikbc新品键盘评测:我爱红轴,不解释!...
  7. C#中lock关键字的用法
  8. 东莞市理工学校计算机分数线,东莞公办中职学校分数线公布,理工学校两专业613分领跑全市...
  9. 智能控制在计算机领域的应用,智能控制的主要应用领域
  10. 西门子与源讯联手打造网络安全技术;全球首个5G全息国际通话打通 | IoT黑板报...
  11. 刚毕业一个月,7 月正式入职深圳互联网公司的前端月度工作汇报 |总结
  12. 第八章 云计算原理与技术
  13. LeetCode第714题解析
  14. c ||和,if判断语句
  15. 在opensuse上安装TL-WDN5200免驱版无线网卡
  16. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
  17. 云从MGN《Learning Discriminative Features with Multiple Granularities for Person Re-Identification》论文阅读
  18. Opencv中flip函数讲解
  19. Windows网络重置常用指令(根据自己使用情况不定期更新)
  20. windows 下 c++ 快速截屏

热门文章

  1. 启动Tomcat服务器报错:Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost are alrea
  2. Linux进阶 | 2万字总结最详细的Docker的安装、底层隔离机制和简单使用!建议收藏,持续更新❤
  3. 抑郁症:从自毁到重生,可能你只差一个它
  4. 实习第五天 工作总结
  5. 感动!刘若英和陈升的那些往事
  6. 二极管的三种击穿形式
  7. BTC EmbeddedPlatform安装手记
  8. EasyUI TreeGrid各行调整上下位置
  9. 2008中国IC十佳(七):深圳芯邦冲刺创业板
  10. java中国象棋兵吃棋规则_中国象棋吃子的规则