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

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

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

Input
输入一个数n表示操作的次数(n<=1*10^5)
接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1)
Output
对于n行操作,分别输出n行YES或者NO
Input示例
3
1 2 1
1 3 1
2 3 0
Output示例
YES
YES
NO 刚开始只是用了一个并查集,维护每一个节点和其父节点的关系,相等或者不相等,
但是这样是不对的,比如a != b,c != b,但是这个时候a和c 的关系不能确定。
改为:
用并查集维护相等的关系,每一个并查集的父节点再维护一个set,放着所有确定了和这个
集合不相等的集合的父节点,然后合并的时候启发式合并一下。 代码:
   //File Name: nod1515.cpp
//Author: long
//Mail: 736726758@qq.com
//Created Time: 2016年09月16日 星期五 23时01分02秒 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
using namespace std;
const int MAXN = + ;
int fa[MAXN];
map<int,int> rem;
set<int> dis[MAXN];
struct Query{
int x,y,p;
}que[MAXN];
int find_fa(int x){
if(fa[x] == x) return x;
return fa[x] = find_fa(fa[x]);
}
void union_to(int x,int y){
fa[y] = x;
set<int>::iterator it;
for(it=dis[y].begin();it!=dis[y].end();it++){
int v = *it;
dis[v].erase(y);
dis[v].insert(x);
dis[x].insert(v);
}
dis[y].clear();
}
void _union(int x,int y){
if(dis[x].size() >= dis[y].size()) union_to(x,y);
else union_to(y,x);
}
void solve(int n,int tot){
for(int i=;i<=n;i++){
que[i].x = rem[que[i].x];
que[i].y = rem[que[i].y];
}
for(int i=;i<=tot;i++){
fa[i] = i;
dis[i].clear();
}
for(int i=;i<=n;i++){
int x = que[i].x,y = que[i].y,p = que[i].p;
int fax = find_fa(x);
int fay = find_fa(y);
if(fax == fay){
if(p) puts("YES");
else puts("NO");
}
else{
if(p){
if(dis[fax].find(fay) != dis[fax].end()) puts("NO");
else{
puts("YES");
_union(fax,fay);
}
}
else{
puts("YES");
dis[fax].insert(fay);
dis[fay].insert(fax);
}
}
}
}
int main(){
int n;
while(~scanf("%d",&n)){
int tot = ;
rem.clear();
for(int i=;i<=n;i++){
scanf("%d %d %d",&que[i].x,&que[i].y,&que[i].p);
if(!rem[que[i].x]) rem[que[i].x] = ++tot;
if(!rem[que[i].y]) rem[que[i].y] = ++tot;
}
solve(n,tot);
}
return ;
}
												

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. Java 并发和多线程(三) 多线程的代价 [转]

    原文链接:http://tutorials.jenkov.com/java-concurrency/costs.html 作者:Jakob Jenkov     翻译:古圣昌        校对:欧振 ...

  2. node

    docker run -d --name data -v c:/jayruanwork/app:/usr/share/app busybox || windows c:\jayruanwork\app ...

  3. NPOI 操作Excel

    关于NPOI NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex. ...

  4. 反向Ajax,实现服务器向客户端推送消息之 Comet

    基于 HTTP 长连接.无须在浏览器端安装插件的“服务器推”技术为“Comet”. 下面将介绍两种 Comet 应用的实现模型. 基于 AJAX 的长轮询(long-polling)方式 AJAX 的 ...

  5. linux grep 命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  6. React Native组件之Text

    React Native组件之Text相当于iOS中的UILabel. 其基本属性如下: /** * Sample React Native App * https://github.com/face ...

  7. Caffe 源碼閱讀(二) SyncedMemory.hpp

    1. to_cpu 數據由現存同步到內存 2. to_gpu 數據由內存同步到顯存 3. cpu_str_ 內存指針 4. gpu_str_ 顯存指針 5. size_ 數據大小 6. own_cpu ...

  8. 金浪网关ESR-6400G 告警解决办法

    防火墙中提示为每秒新建连接数大于设定范围,自动断开改IP两分钟 解决办法:更换MAC地址与IP地址 下图是防火墙设置

  9. 一种Go使用tcp检测超时的方式

    c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, ...

  10. 解决ubuntu下安装phpmyadmin访问不了的问题

    在/etc/apache2/sites-available下有个文件 000-default.conf 文件为只读,需要sudo 命令修改,  把DocumentRoot /var/www/html ...