给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. cf

    Financing a capital project with equity may be a signal to investors that a company's prospects are ...

  2. JAVA OOP 基础知识提纲

    OOP: 面向对象: 认识事物的一个过程,是整体(特征/行为) 认识事物的方式.人类认识事物的自然思维习惯. 对象及类 对象是实实在在具体存在的东西,主要是从两个角度(行为,特征)去观察 类:是一组具 ...

  3. CodeForces #369 C. Coloring Trees DP

    题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少.   K:连续的颜色为一组 ...

  4. what is archeage honor weapons?

    in my opinion,there are many kinds of weapons in archeage online, those include basic weapons and ma ...

  5. css关系选择器

    1.包含选择符(E F) 选择所有被E元素包含的F元素,中间用空格隔开示例:<!DOCTYPE html><html> <head> <meta charse ...

  6. python打印目录下的文件名

    打印当前目录所有文件名 import fnmatch, os def allFiles(root, patterns = '*', single_level = False, yield_folder ...

  7. 在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute

    导入导出功能,在调用ShowDialog时的错误,解决办法如下: WinForm窗体的入口点: /// <summary> /// 应用程序的主入口点. /// </summary& ...

  8. Jenkins 2.26 发布,可扩展的持续集成引擎

    Jenkins 2.26 发布了.Jenkins 主要用于持续.自动地构建/测试软件项目,如CruiseControl与DamageControl,监控一些定时执行的任务.更新内容: Allow Co ...

  9. js中退出语句break,continue和return 比较 (转载)

    在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是返回的同时也将函数停止 首先:break和continue两个一 ...

  10. 数组第K小数问题 及其对于 快排和堆排 的相关优化比较

    题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...