题意:若干个人中告诉你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(并查集)相关推荐

  1. Almost Union-Find(Uva 11987)并查集

    来自<算法竞赛入门经典训练指南> 1.题目原文 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...

  2. uva 10158 War (并查集)

    uva 10158 War 四个操作:1)使AB成为朋友.2)使AB成为敌人.3)询问AB是不是朋友.4)询问AB是不是敌人.PS:敌人的敌人是朋友.朋友的朋友是朋友. 开一个2 * n的数组,0~n ...

  3. UVA 1329 Corporative Network(并查集:路径压缩)

    UVA 1329 Corporative Network(并查集:路径压缩) 2014年03月09日 00:19:33 阅读数:914 UVA 1329 Corporative Network(并查集 ...

  4. UVA 11165 - Galactic Travel(BFS+twopointer+并查集)

    UVA 11165 - Galactic Travel 题目链接 题意:给定一些不能走的边,要求出从s到t的最短路 思路:由于点数多,直接广搜会超时,所以加上优化,已经找过的点就不在重复找了,这点可以 ...

  5. Almost Union-Find UVA - 11987(并查集的删除操作)

    题意:求出每个集合的元素个数,及总和,给出三个操作: 1 将含有a元素和b元素的集合合并:2 将a元素放入含有b元素的集合中:3 输出a元素所在集合的元素个数及总和: 思路:正常并查集,与并查集元素的 ...

  6. UVA - 208 Firetruck(并查集+dfs)

    题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...

  7. UVA - 10129 Play on Words(欧拉回路+并查集)

    2.解题思路:本题利用欧拉回路存在条件解决.可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点.由于本题还要求了两个单词拼在一起的条件是前一个 ...

  8. 紫书 习题 11-12 UVa 1665 (并查集维护联通分量)

    这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先 ...

  9. UVA 1455 Kingdom 线段树+并查集

    并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...

最新文章

  1. 如何在mac终端上使用python3.5
  2. LeetCode Remove Element
  3. 电脑网络安全_电脑网络:计算机网络安全,从入门到入狱
  4. Mysql俩种表级锁
  5. 2020年第十八届西电程序设计竞赛网络预选赛之Problem A 失败的在线考试
  6. HBase基本概念与基本使用
  7. raspberry pi_如何启动新的Raspberry Pi
  8. vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具
  9. HTML5的革新:结构之美
  10. PetShop的系统架构设计
  11. android方法中添加 N,AndroidN(7.0)Settings模块界面加载流程学习
  12. E-Prime1.1安装教程及软件下载
  13. 基于Vivado的程序下载
  14. javaeye改名之后
  15. AC/DC、DC/DC转换器基础指南(二)
  16. 如何批量提取多个 PDF 文档中的图片
  17. c语言 宏定义 去除宏定义_如何在C中重新定义宏?
  18. MFC基于对话框使用dll进行多语言切换
  19. 蓝牙计算机操作与设置在哪里,win7电脑蓝牙在哪里打开_win7笔记本怎么开蓝牙
  20. CHM文档编辑制作及电子书的相关问题 - txfast的日志 - 网易博客 http://txfast.blog.163.com/blog/static/40536042200832065417/

热门文章

  1. linux系统用户管理
  2. symfony php 亿万,php – symfony中的内存不足错误
  3. java `Charset`或者`StandardCharsets`
  4. Spring mvc 文件上传
  5. javascript window.screen
  6. 22 File Links: Hard and Symbolic
  7. docker 配置ssh
  8. Bokeh 风格属性设置
  9. 常常被人忽略的VC备份
  10. Linux学习总结(40)——史上最全Linux命令科普