题目选自洛谷P1955

比较复杂一点的并查集题目,还用到了离散化的思想

首先明确一点:相等具有传递性,不相等不具有传递性(Eg:若x1等于x2,x2等于x3时,显然x1=x3。但当x1不等于x2,x2不等于x3时,x1不一定不等于x3)。

因此,所有ei相等的的约束条件之间互不冲突。

所以,只有在当ei=0的约束条件与已有的其他ei=1的约束条件发生冲突时,程序才会输出NO。

提醒:先执行ei=1的操作,再执行ei=0的操作(因为我们是拿ei=0的操作去和所有ei=1的操作去比较看是否冲突)。

最后注意xi和xj的数据范围(1<=xi,xj<=1e9),所以离散化输入的xi,xj(不然并查集数组开不下)。

总得来说离散化有三步走战略:

1.去重(可以用到unique去重函数)

2.排序

3.二分索引(可以用到lower_bound函数)

题目描述

输入格式

输出格式

输入输出样例

输入 1

2
2
1 2 1
1 2 0
2
1 2 1
2 1 1

输出 1

NO
YES

输入 2

2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0

输出 2

YES
NO

说明/提示

解题代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int t,n;
int f[100010],book[1000007*3];
struct node{int x,y,e;
}d[1000001];
bool cmp(node a,node b){ //排序return a.e > b.e;
}
void init(int xx){ //初始化for(int i=1;i<=xx;i++) f[i] = i;
}
int find(int x){ //查找if(x == f[x]) return x;return f[x] = find(f[x]);
}
void merge(int x,int y){  //合并if(find(x) != find(y))f[find(x)] = find(y);
}
int main(){cin>>t;while(t--){cin>>n;int tot=-1,flag=1;memset(book,0,sizeof(book));memset(d,0,sizeof(d));memset(f,0,sizeof(f));for(int i=1;i<=n;i++){cin>>d[i].x>>d[i].y>>d[i].e;book[++tot]=d[i].x;book[++tot]=d[i].y;}sort(book,book+tot);int reu=unique(book,book+tot)-book;for(int i=1;i<=n;i++){d[i].x=lower_bound(book,book+reu,d[i].x)-book;d[i].y=lower_bound(book,book+reu,d[i].y)-book;   }init(reu);sort(d+1,d+1+n,cmp);for(int i=1;i<=n;i++){int r1=find(d[i].x);int r2=find(d[i].y);if(d[i].e){f[r1]=r2;  //就是我们的merge操作 }else if(r1==r2){printf("NO\n");flag=0;  //如果不满足条件,标记为否 break;}}if(flag)    printf("YES\n");   //都满足条件了 }return 0;
}

并查集——程序自动分析(洛谷 P1955)相关推荐

  1. 并查集——关押罪犯(洛谷 P1525)

    题目选自洛谷P1525 此题是一道很经典,而且很好的题目.思路也十分的新颖,比较的难以捉摸. 题面大意:(人性翻译) 给你m对矛盾关系,每对关系分别涉及到x,y两人,矛盾值为w 请你判断分配x和y到两 ...

  2. 并查集——村村通(洛谷 P1536)

    题目选自洛谷P1536 并查集的变相考察类型的题目 先处理每一条存在的边,即把每条存在的边所连接的两个结点用并查集合并起来. 然后通过记录不同的代表元个数,就可以知道有多少个集合,即有多少个连通块了. ...

  3. 洛谷 P1955 [NOI2015]程序自动分析(沙雕题)

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3-代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相 ...

  4. 程序自动分析(洛谷-P1955)

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  5. 洛谷·[POI2005]SKA-Piggy Banks 小猪存钱罐【Tarjan 并查集

    初见安~这里是传送门:洛谷P3420 题目描述3 Byteazar the Dragon has NN piggy banks. Each piggy bank can either be opene ...

  6. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

  7. 并查集——营救(洛谷 P1396)

    题目选自洛谷P1396 看到最大的最小很多人想到二分,但是可以有更好的解法. 我们不妨用并查集维护这个图,将边从小到大排序,每次取出边权最小的边,若该边的起点与终点未在一个集合内,就将其合并.当源点与 ...

  8. 并查集模板——并查集(洛谷 P3367)

    题目选自洛谷P3367 是并查集的最入门的题目,也是并查集的模板题~~ 如果你还不知道并查集是什么? 请看我的这篇文章 点击链接 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 ...

  9. 并查集——团伙(洛谷 P1892)

    题目选自洛谷P1892 最基础的并查集是给出关系直接合并,这道题呢稍微多了一些条件,就是敌人的敌人也是自己的朋友,所以在合并的时候多了几步操作. 首先,要充分理解题目. "敌人的敌人就是朋友 ...

最新文章

  1. C#人爱学不学9[C#5.0异步实例+WPF自己的MVVM Async应用 1/12]
  2. mysql中describe怎么用_MySQL中describe命令的使用方法小结
  3. jQuery的延迟对象
  4. java设计模式--简单工厂设计模式SimpleFactoryPattern
  5. Java Secret:使用枚举构建状态机
  6. 超简单的分布式ID生成方案!美团开源框架介绍
  7. The Breakpoint will not currently be hit. No executable code associated with this line
  8. java 找出调用的方法_如何找到用Java调用给定方法的所有方法?
  9. js实现css、addClass、removeClass和toggleClass
  10. java time schedule_Java Timer schedule疑问
  11. android 文件转base64 base64字符串转文件 语音留言及语音播放
  12. 用c语言编写小游戏:贪吃蛇
  13. 如何划分和细化有限元网格,才能提高计算的精度和速度?
  14. html5 shiv
  15. Origin: Piper diagram/Trilinear diagram (三线图)
  16. 基于matlab的字符识别系统
  17. IntelliJ IDEA 超实用使用技巧分享
  18. 小武与论文的bug -CUDA -CUDANN -YOLOV3
  19. jmeter之取样器(HTTP请求、调试取样器)
  20. 关于kali连不上网络

热门文章

  1. Windows 2003安全事件ID分析(1)
  2. android给图片加边框,Android学习笔记进阶19之给图片加边框
  3. ant指定servlet版本_[转载]程序开发常见错误
  4. Java 反射(Array相关)
  5. 姑苏山塘飞雪披银装[组图]
  6. sysadmin默认密码_从sysadmin过渡到DevOps工程师的案例
  7. 如何在Web浏览器中查看XML文件
  8. 开源 sql 代码提示工具_有关如何计划开源活动的提示
  9. github初学者指南_GitHub初学者指南
  10. 云架构师是做什么的_为什么以及如何成为云架构师