并查集+ 离散化

首先本题的数据范围很大,需要离散化,

STL离散化代码:

	//dat是原数据,id是编号,sub是数据的副本
sort(sub + 1, sub + tot + 1);
size = unique(sub + 1, sub + tot + 1) - sub - 1;
for(int i = 1; i <= tot; i++) {
id[i] = lower_bound(sub + 1, sub + size + 1, dat[i]) - sub;
}

并查集所能维护的是具有传递性的关系,比如本题中 等于 就是这样的关系,而不等就不是.

所以本题的思路非常简单,首先处理出来等于的关系,对于每一个不等的关系找矛盾即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 100005;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh *rv;
}
struct opt{
int x, y;
bool f;
}e[MAXN];
int T, n, id[MAXN<<1], dat[MAXN<<1], tot, sub[MAXN<<1], size, fa[MAXN<<2];
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
void merge(int x, int y) {
if(x == y) return;
int r1 = find(x), r2 = find(y);
if(r1 != r2) fa[r1] = r2;
}
int main() {
T = init();
while(T--){
memset(e, 0, sizeof(e));
n = init();
tot = 0; size = 0;
for(int i = 1; i <= n; i++) {
e[i].x = init(); e[i].y = init(); e[i].f = init();
tot++; dat[tot] = sub[tot] = e[i].x;
tot++; dat[tot] = sub[tot] = e[i].y;
}
sort(sub + 1, sub + tot + 1);
size = unique(sub + 1, sub + tot + 1) - sub - 1;
for(int i = 1; i <= tot; i++) {
id[i] = lower_bound(sub + 1, sub + size + 1, dat[i]) - sub;
}
for(int i = 1; i <= size; i++) {
fa[i] = i;
}
/*for(int i = 1; i <= tot ; i++) printf("%d %d\n", id[i], dat[i]);
printf("\n");*/
bool fff = 0;
for(int i = 1; i <= n; i++) {
e[i].x = id[i * 2 - 1]; e[i].y = id[i * 2];
if(e[i].f) {
merge(e[i].x, e[i].y);
}
}
for(int i = 1; i <= n; i++) {
if(!e[i].f) {
if(find(e[i].x) == find(e[i].y)) {fff = 1;break;}
}
}
if(!fff) {
printf("YES\n");
}else printf("NO\n");
}
return 0;
}

最新文章

  1. Daily Scrum02 12.13
  2. Caffe+CUDA7.5+CuDNNv3+OpenCV3.0+Ubuntu14.04 配置参考文献 以及 常见编译问题总结
  3. Maven学习笔记-01-Maven入门
  4. 113. Path Sum II
  5. NOIP2001 Car的旅行路线
  6. iOS开发之Runtime常用示例总结
  7. 运维必须掌握的150个Linux命令
  8. 《C程序设计语言》【PDF】下载链接:
  9. buils tool是什么?为什么使用build tool?java主流的build tool
  10. HDU 1301-Jungle Roads【Kruscal】模板题
  11. Js — CommonUtil
  12. centos 扩容
  13. 多媒体基础知识之PCM数据《 转》
  14. quartz---触发job时间和结束时间
  15. GreatSct -应用程序白名单bypass工具
  16. [实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册
  17. GDAL中GDALDataset::RasterIO分块读取的实现
  18. Hadoop-2.4.1学习之Streaming编程
  19. vue-persist 为 vuex 持久化!!
  20. 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)

热门文章

  1. WebStorm 配置less
  2. Maven添加本地依赖
  3. elastic-job lite 编程实战经验
  4. 关于 QObject 类
  5. 美国司法部解禁guns打印技术
  6. shell补充知识点
  7. Python字符编码补充
  8. No-11.变量进阶
  9. ios设备屏幕尺寸与分辨率
  10. C#获得DataTable的key值