UVa10158 War(并查集)
这道题是并查集的应用,很好的题型
思路我也是参照别人的思路,不过思路很简单的
题中说了很多很复杂的关于朋友还是敌人的东西,其实你读透了就会发现,其实就是一句话,如果你是我的朋友的朋友,那么我们就有公共的敌人
也就是说这个朋友圈的人, 和敌人圈的人没有交集;
但是到底是朋友还是敌人,怎么表示
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(并查集)相关推荐
- UVA10158 - War(并查集)
UVA10158 - War(并查集) 题目链接 题目大意:有n个国家,每个国家有友国和敌国,并且遵守着朋友的朋友是朋友,敌人的敌人是朋友的原则,给你四种操作,题目中有描述,然后让你根据操作进行,对应 ...
- uva 10158 - War(并查集)
题目链接:10158 - War 题目大意:有n个人,若干个命令,每个人分属于不同的国家,并且代表国家与其他代表会谈,这将决定国与国之间的同盟关系,1:a与b结盟 2:a与b决裂(成为敌人) 3:判 ...
- UVA 10158 War 并查集
第一次自己写并差集一次ac,纪念一下 #include<iostream> #include<algorithm> #include<cstdio> #includ ...
- [逆向并查集+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 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...
最新文章
- 一星期没完成Ansible任务
- 西南大学计算机英语统考时间,西南大学2018年9月全国计算机等级考试报名通知...
- 从“埋点技术已死?”开始说起
- 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...
- oracle imp 1403,Oracle中用exp/imp命令参数详解【转】
- boost::function模块boost::lambda::bind用法的测试程序
- springboot配置Filter的两种方法
- 汇编软件的安装与实验一
- 【博客大赛】100行js代码实现网站在线用户数量统计 nodejs + socket.io方案
- 德江多措施推进大数据应用“智慧德江”建设
- 背包问题 尽可能大和大于某个值 为什么是一样意思
- OLTP在线事务处理
- 2020 华为 一面 二面 面经
- 超标量处理器设计 姚永斌 第10章 指令提交 摘录
- 麒麟服务器数据库协议,麒麟服务器神通数据库安装
- 强烈推荐这个Java学习文档——不看后悔系列
- 【Godot】项目结构设计
- 深入PCI与PCIe之一:硬件篇
- 蒟蒻的WA之路——二分法学习
- 【MATLAB】铰链四杆机构运动分析(GUI设计)
热门文章
- 看《大明王朝1566》聊分布式中的CAP和BASE理论
- java当中的定时器的4种使用方式(delay,period)
- 前端学习之路---node.js(二)
- Tengine + BabaSSL ,让国密更易用
- 综合布线之“五星对话”
- Java中的浮点型数据类型
- python实现数据恢复软件手机版下载_知名下载软件,总算出手机版了
- java map集合的等号改为逗号_老司机用一篇博客带你快速熟悉Dart语法
- purifier 常用配置 保留 id 和 iframe
- java商品详情页设计_java高并发秒杀系统3-2节商品详情页上.mp4