uva 10158(并查集)
题意:若干个人中告诉你1 a b是朋友2 a b是敌人3 a b查询是否是朋友3 a b查询是否是敌人。前两个若是矛盾则输出-1,否则不输出。后面两个是输出1不是输出0。并且朋友的朋友是朋友,敌人的敌人是朋友。(题目中的人只会来自于两个不同的集合)
思路:建立两个并查集一个维护每个人的朋友集合,另一个维护这个人的敌人集合。在每次查询后需要维护四个集合,与a的朋友集合,b的朋友集合,a的敌人集合,b的敌人集合。对于前两个操作若是产生矛盾输出-1否则更新关系,对于后两个直接判断。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #define LEN 200010 10 #define ll long long 11 #define eps 1E-8 12 #define mp(a,b) make_pair(a,b) 13 #define INF 0x7fffffff 14 15 using namespace std; 16 17 //UFSet 18 int parent[LEN]; 19 void init(){for(int i=0; i<LEN; i++)parent[i] = i;} 20 int Find(int x){return parent[x] == x?x:Find(parent[x]);} 21 22 int main() 23 { 24 // freopen("in.txt", "r", stdin); 25 26 int n; 27 int q, a, b; 28 while(scanf("%d", &n)!=EOF){ 29 init(); 30 while(scanf("%d%d%d", &q, &a, &b)!=EOF && q){ 31 int pa = Find(a); 32 int pb = Find(b); 33 int ea = Find(n+a); 34 int eb = Find(n+b); 35 switch(q) 36 { 37 case 1: 38 if(pa==eb) printf("-1\n"); 39 else { 40 parent[pa] = pb; 41 parent[ea] = eb; 42 } 43 break; 44 case 2: 45 if(pa==pb)printf("-1\n"); 46 else { 47 parent[pa] = eb; 48 parent[ea] = pb; 49 } 50 break; 51 case 3: 52 if(pa==pb) printf("1\n"); 53 else printf("0\n"); 54 break; 55 case 4: 56 if(pa==eb) printf("1\n"); 57 else printf("0\n"); 58 break; 59 } 60 } 61 } 62 return 0; 63 }
View Code
转载于:https://www.cnblogs.com/shu-xiaohao/p/3480443.html
uva 10158(并查集)相关推荐
- Almost Union-Find(Uva 11987)并查集
来自<算法竞赛入门经典训练指南> 1.题目原文 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...
- uva 10158 War (并查集)
uva 10158 War 四个操作:1)使AB成为朋友.2)使AB成为敌人.3)询问AB是不是朋友.4)询问AB是不是敌人.PS:敌人的敌人是朋友.朋友的朋友是朋友. 开一个2 * n的数组,0~n ...
- UVA 1329 Corporative Network(并查集:路径压缩)
UVA 1329 Corporative Network(并查集:路径压缩) 2014年03月09日 00:19:33 阅读数:914 UVA 1329 Corporative Network(并查集 ...
- UVA 11165 - Galactic Travel(BFS+twopointer+并查集)
UVA 11165 - Galactic Travel 题目链接 题意:给定一些不能走的边,要求出从s到t的最短路 思路:由于点数多,直接广搜会超时,所以加上优化,已经找过的点就不在重复找了,这点可以 ...
- Almost Union-Find UVA - 11987(并查集的删除操作)
题意:求出每个集合的元素个数,及总和,给出三个操作: 1 将含有a元素和b元素的集合合并:2 将a元素放入含有b元素的集合中:3 输出a元素所在集合的元素个数及总和: 思路:正常并查集,与并查集元素的 ...
- UVA - 208 Firetruck(并查集+dfs)
题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...
- UVA - 10129 Play on Words(欧拉回路+并查集)
2.解题思路:本题利用欧拉回路存在条件解决.可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点.由于本题还要求了两个单词拼在一起的条件是前一个 ...
- 紫书 习题 11-12 UVa 1665 (并查集维护联通分量)
这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先 ...
- UVA 1455 Kingdom 线段树+并查集
并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...
最新文章
- 如何在mac终端上使用python3.5
- LeetCode Remove Element
- 电脑网络安全_电脑网络:计算机网络安全,从入门到入狱
- Mysql俩种表级锁
- 2020年第十八届西电程序设计竞赛网络预选赛之Problem A 失败的在线考试
- HBase基本概念与基本使用
- raspberry pi_如何启动新的Raspberry Pi
- vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具
- HTML5的革新:结构之美
- PetShop的系统架构设计
- android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
- E-Prime1.1安装教程及软件下载
- 基于Vivado的程序下载
- javaeye改名之后
- AC/DC、DC/DC转换器基础指南(二)
- 如何批量提取多个 PDF 文档中的图片
- c语言 宏定义 去除宏定义_如何在C中重新定义宏?
- MFC基于对话框使用dll进行多语言切换
- 蓝牙计算机操作与设置在哪里,win7电脑蓝牙在哪里打开_win7笔记本怎么开蓝牙
- CHM文档编辑制作及电子书的相关问题 - txfast的日志 - 网易博客 http://txfast.blog.163.com/blog/static/40536042200832065417/