给n组操作,每组操作形式为x y p。

当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。

当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。

Input
  1. 输入一个数n表示操作的次数(n<=1*10^5)
  2. 接下来n行每行三个数x,y,px,y<=1*10^8,p=0 or 1
Output
  1. 对于n行操作,分别输出nYES或者NO
Input示例
  1. 3
  2. 1 2 1
  3. 1 3 1
  4. 2 3 0
Output示例
  1. YES
  2. YES
  3. NO
  4.  
  5. 刚开始只是用了一个并查集,维护每一个节点和其父节点的关系,相等或者不相等,
    但是这样是不对的,比如a != b,c != b,但是这个时候ac 的关系不能确定。
    改为:
    用并查集维护相等的关系,每一个并查集的父节点再维护一个set,放着所有确定了和这个
    集合不相等的集合的父节点,然后合并的时候启发式合并一下。
  6.  
  7. 代码:
  1. //File Name: nod1515.cpp
  2. //Author: long
  3. //Mail: 736726758@qq.com
  4. //Created Time: 2016年09月16日 星期五 23时01分02秒
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <set>
  11. #include <map>
  12. using namespace std;
  13. const int MAXN = + ;
  14. int fa[MAXN];
  15. map<int,int> rem;
  16. set<int> dis[MAXN];
  17. struct Query{
  18. int x,y,p;
  19. }que[MAXN];
  20. int find_fa(int x){
  21. if(fa[x] == x) return x;
  22. return fa[x] = find_fa(fa[x]);
  23. }
  24. void union_to(int x,int y){
  25. fa[y] = x;
  26. set<int>::iterator it;
  27. for(it=dis[y].begin();it!=dis[y].end();it++){
  28. int v = *it;
  29. dis[v].erase(y);
  30. dis[v].insert(x);
  31. dis[x].insert(v);
  32. }
  33. dis[y].clear();
  34. }
  35. void _union(int x,int y){
  36. if(dis[x].size() >= dis[y].size()) union_to(x,y);
  37. else union_to(y,x);
  38. }
  39. void solve(int n,int tot){
  40. for(int i=;i<=n;i++){
  41. que[i].x = rem[que[i].x];
  42. que[i].y = rem[que[i].y];
  43. }
  44. for(int i=;i<=tot;i++){
  45. fa[i] = i;
  46. dis[i].clear();
  47. }
  48. for(int i=;i<=n;i++){
  49. int x = que[i].x,y = que[i].y,p = que[i].p;
  50. int fax = find_fa(x);
  51. int fay = find_fa(y);
  52. if(fax == fay){
  53. if(p) puts("YES");
  54. else puts("NO");
  55. }
  56. else{
  57. if(p){
  58. if(dis[fax].find(fay) != dis[fax].end()) puts("NO");
  59. else{
  60. puts("YES");
  61. _union(fax,fay);
  62. }
  63. }
  64. else{
  65. puts("YES");
  66. dis[fax].insert(fay);
  67. dis[fay].insert(fax);
  68. }
  69. }
  70. }
  71. }
  72. int main(){
  73. int n;
  74. while(~scanf("%d",&n)){
  75. int tot = ;
  76. rem.clear();
  77. for(int i=;i<=n;i++){
  78. scanf("%d %d %d",&que[i].x,&que[i].y,&que[i].p);
  79. if(!rem[que[i].x]) rem[que[i].x] = ++tot;
  80. if(!rem[que[i].y]) rem[que[i].y] = ++tot;
  81. }
  82. solve(n,tot);
  83. }
  84. return ;
  85. }
  1.  

51nod 1515 明辨是非 并查集 + set + 启发式合并的更多相关文章

  1. 51nod 1515 明辨是非 [并查集+set]

    今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...

  2. 51Nod 1515 明辨是非 —— 并查集 + 启发式合并

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非  题目来源: 原创 基准时间限制:1 ...

  3. 51nod 1515 明辨是非 并查集+set维护相等与不等关系

    考试时先拿vector瞎搞不等信息,又没离散化,结果好像MLE:后来想起课上讲过用set维护,就开始瞎搞迭代器...QWQ我太菜了.. 用并查集维护相等信息,用set记录不相等的信息: 如果要求变量不 ...

  4. 51 nod 1515 明辨是非(并查集合并)

    1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...

  5. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  6. 并查集+优先队列+启发式合并 || 罗马游戏 || BZOJ 1455 || Luogu p2713

    题面:P2713 罗马游戏 题解: 超级大水题啊,特别水.. 并查集维护每个人在哪个团里,优先队列维护每个团最低分和最低分是哪位,然后每次判断一下哪些人死了,随便写写就行 并查集在Merge时可以用启 ...

  7. [NOI2015] 品酒大会 - 后缀数组,并查集,STL,启发式合并

    [NOI2015] 品酒大会 Description 对于每一个 \(i \in [0,n)\) 求有多少对后缀满足 LCP 长度 \(\le i\) ,并求满足条件的两个后缀权值乘积的最大值. So ...

  8. CDOJ1927 爱吃瓜的伊卡洛斯(2) 【并查集】启发式合并+set

    伊卡洛斯很爱吃西瓜.一次,他来到一个西瓜摊旁,发现水果摊有N个西瓜,西瓜有红色.黄色.绿色.蓝色……等等数不清的颜色. 伊卡洛斯很想知道知道一些信息,便于老板交谈了起来. 当老板的话的第一个字符为”A ...

  9. 51nod 1204 Parity(并查集应用)

    1204 Parity 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串 ...

随机推荐

  1. 读javascript高级程序设计02-变量作用域

    一. 延长作用域链 有些语句可以在作用域前端临时增加一个变量对象,该变量对象在代码执行完成后会被移除. ①with语句延长作用域. function buildUrl(){ var qs=" ...

  2. mysql 二进制日志

      1.日志类型   二进制日志记录了所有对mysql数据库的修改事件,包括增删改事件和对表结构的修改事件.   2.配置使用二进制日志 在my.ini 配置 log-bin=mysql-bin   ...

  3. WCF初探-7:WCF服务配置工具使用

    在上一篇WCF服务配置中,文章讲解了WCF的配置所需要的基本节点和属性构造,但是对于初学者的我们在编写程序的时候,往往对这些节点的位置和属性不是特别清楚,所以就导致我们的因配置文件错误而不能运行服务程 ...

  4. 关于win2008r2上配置iis,出现加密代码与联邦基础加密冲突的问题的解决

    在win2008r2上配置asp.net网站时,出现这个问题: This implementation is not part of the Windows Platform FIPS validat ...

  5. hibernate FetchType理解

    JPA定义实体之间的关系有如下几种: @OneToOne @ManyToOne @OneToMany @ManyToMany 在定义它们的时候可以通过fetch属性指定加载方式,有两个值: Fetch ...

  6. stage simulator

    ---恢复内容开始--- 运行自带地图 rosrun stage_ros stageros /opt/ros/indigo/share/stage_ros/world/willow-erratic.w ...

  7. CentOS6.4安装Hadoop2.0.5 alpha - Single Node Cluster

    1.安装JDK7 rpm到/usr/java/jdk1.7.0_40,并建立软链接/usr/java/default到/usr/java/jdk1.7.0_40 [root@server-308 ~] ...

  8. 谷歌浏览器中安装.crx扩展名的离线Chrome插件

    一.本地拖放安装 1.下载扩展程序/脚本程序至本地计算机: 2.将其直接拖拽到浏览器的“扩展程序”(chrome://chrome/extensions/)页面. 二.解决“只能通过Chrome网上应 ...

  9. JavaScript基础--简单功能的计算器(十一)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. iOS学习之NSPredictae及搜索框的实现

    NSPredicate Predicate 即谓词逻辑, Cocoa框架中的NSPredicate用于查询,作用是从数据堆中根据条件进行筛选.计算谓词之后返回的结果永远为BOOL类型的值,当程序使用谓 ...