这道题是并查集的应用,很好的题型

思路我也是参照别人的思路,不过思路很简单的

题中说了很多很复杂的关于朋友还是敌人的东西,其实你读透了就会发现,其实就是一句话,如果你是我的朋友的朋友,那么我们就有公共的敌人

也就是说这个朋友圈的人, 和敌人圈的人没有交集;

但是到底是朋友还是敌人,怎么表示

n个人,用2*n个点表示,前n个表示本身,后n个表示相应点的分身,如果是朋友,就把本身加进去,如果是敌人,就把分身加进去

判断是不是敌人的时候,就看相应的分身和另一个本身是不是在一个集合里;如果判断是不是朋友,就看两个本身在不在一个集合里面

代码如下:

#include <cstdio>
#include <cstring>const int N = 20020;
int fa[N], n;
int find ( int a ) {return fa[a] == a ? a : fa[a] = find(fa[a]);
}
void setFriend( int a, int b ) {int x1, x2, y1, y2;x1 = find(a), y1 = find(b);x2 = find(a+n), y2 = find(b+n);if ( x1 == y2 || x2 == y1 ) printf("-1\n");else {fa[x1] = y1;fa[x2] = y2;}
}
void setEnemy( int a, int b ) {int x1, x2, y1, y2;x1 = find(a), y1 = find(b);x2 = find(a+n), y2 = find(b+n);if ( x1 == y1 ) printf("-1\n");else {fa[x1] = y2;fa[y1] = x2;}
}
void areFriend( int a, int b ) {int x, y;x = find(a);y = find(b);if ( x == y ) printf("1\n");else printf("0\n");
}
void areEnemy( int a, int b ) {int x1, x2, y1, y2;x1 = find(a), y1 = find(b);x2 = find(a+n), y2 = find(b+n);if ( x2 == y1 || x1 == y2 ) printf("1\n");else printf("0\n");
}int main()
{while ( scanf("%d", &n) != EOF ) {int c, a, b;for ( int i = 0; i <= n*2; ++i ) fa[i] = i;while ( 1 ) {scanf("%d%d%d", &c, &a, &b);if ( a == 0 && c == 0 && b == 0 ) break;if ( c == 1 ) setFriend( a, b );else if ( c == 2 ) setEnemy( a, b );else if ( c == 3 ) areFriend( a, b );else if ( c == 4 ) areEnemy( a, b );}}return 0;
}

UVa10158 War(并查集)相关推荐

  1. UVA10158 - War(并查集)

    UVA10158 - War(并查集) 题目链接 题目大意:有n个国家,每个国家有友国和敌国,并且遵守着朋友的朋友是朋友,敌人的敌人是朋友的原则,给你四种操作,题目中有描述,然后让你根据操作进行,对应 ...

  2. uva 10158 - War(并查集)

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

  3. UVA 10158 War 并查集

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

  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. 一星期没完成Ansible任务
  2. 西南大学计算机英语统考时间,西南大学2018年9月全国计算机等级考试报名通知...
  3. 从“埋点技术已死?”开始说起
  4. 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...
  5. oracle imp 1403,Oracle中用exp/imp命令参数详解【转】
  6. boost::function模块boost::lambda::bind用法的测试程序
  7. springboot配置Filter的两种方法
  8. 汇编软件的安装与实验一
  9. 【博客大赛】100行js代码实现网站在线用户数量统计 nodejs + socket.io方案
  10. 德江多措施推进大数据应用“智慧德江”建设
  11. 背包问题 尽可能大和大于某个值 为什么是一样意思
  12. OLTP在线事务处理
  13. 2020 华为 一面 二面 面经
  14. 超标量处理器设计 姚永斌 第10章 指令提交 摘录
  15. 麒麟服务器数据库协议,麒麟服务器神通数据库安装
  16. 强烈推荐这个Java学习文档——不看后悔系列
  17. 【Godot】项目结构设计
  18. 深入PCI与PCIe之一:硬件篇
  19. 蒟蒻的WA之路——二分法学习
  20. 【MATLAB】铰链四杆机构运动分析(GUI设计)

热门文章

  1. 看《大明王朝1566》聊分布式中的CAP和BASE理论
  2. java当中的定时器的4种使用方式(delay,period)
  3. 前端学习之路---node.js(二)
  4. Tengine + BabaSSL ,让国密更易用
  5. 综合布线之“五星对话”
  6. Java中的浮点型数据类型
  7. python实现数据恢复软件手机版下载_知名下载软件,总算出手机版了
  8. java map集合的等号改为逗号_老司机用一篇博客带你快速熟悉Dart语法
  9. purifier 常用配置 保留 id 和 iframe
  10. java商品详情页设计_java高并发秒杀系统3-2节商品详情页上.mp4