给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 这题目描述实在是很迷,看了半天才明白,一共三种关系,相等,不相等和不确定,只有YES操作会改变不确定关系。
用set来维护限制不相等的数,用并查集维护限制相等的数,两个数从不确定到不相等,互相插入对方的set;两个数从不确定到相等,改变他们的父结点,默认将小的那个集合的父结点改成大的,就是大吃小的意思。
 #include <iostream>
#include <cstdio>
#include <set>
#include <map> using namespace std; const int MAXN = 2e5 + ; int n, cnt = ,f[MAXN];
set<int> nt[MAXN];
map<int, int> eq; int find(int x)
{
return f[x] == x ? x : f[x] = find(f[x]);
} int main()
{
//freopen("in.txt","r",stdin);
cin>>n;
n +=;
for (int i = ; i <= n; i++)
{
f[i] = i;
}
n -=; int x, y, p;
while (n--)
{
cin>>x>>y>>p;
if (eq[x])//计数标号
{
x = eq[x];
}
else
{
++cnt;
eq[x]=cnt;
x=cnt;
}
if (eq[y])
{
y = eq[y];
}
else
{
++cnt;
eq[y]=cnt;
y=cnt;
}
int u = find(x), v = find(y);
if (p == )//限制相等
{
if (nt[u].count(v)) //限制不相等
{
cout<<"NO"<<endl;
}
else if (u != v) //未限制但并未相等
{
if (nt[u].size() > nt[v].size())
{
swap(u, v);
}
f[u] = v;
set<int>::iterator it;
for (it = nt[u].begin(); it != nt[u].end(); it++)
{
nt[*it].insert(v);
nt[v].insert(*it);
}
cout<<"YES"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
else//限制不相等
{
if (u == v)
{
cout<<"NO"<<endl;
}
else
{
nt[u].insert(v);
nt[v].insert(u);
cout<<"YES"<<endl;
}
}
} return ;
}

51nod-1515 明辨是非——并查集的更多相关文章

  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 + 启发式合并

    给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...

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

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

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

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

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

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

  7. 51nod 1515:明辨是非 并查集合并

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

  8. 51nod 1515 明辨是非 启发式合并

    1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...

  9. 51nod1515 明辨是非 并查集 + set

    一开始想的时候,好像两个并查集就可以做......然后突然懂了什么.... 相同的并查集没有问题,不同的就不能并查集了,暴力的来个set就行了..... 合并的时候启发式合并即可做到$O(n \log ...

随机推荐

  1. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  2. linux SMbus错误

    针对piix4_smbus ****host smbus controller not enabled的解决方法 查看文件并用超级权限修改内容 在末尾加入blacklist i2c——piix4 重启 ...

  3. DPL, CPL及RPL之间的关系

    DPL: Descriptor Privilege Level 1) GDT/LDT表中的描述符 GDT/LDT表中的描述符,描述的是一段内存. 其中的DPL代表着GDT/LDT中的描述符描述的内存段 ...

  4. shell awk匹配字符串(从配置文件)

    配置文件 config.properties xxx_yyy_lib_path="路径" xxx_yyy_bin_path="路径" 想通过shell来读入路径 ...

  5. Centos7安装 Hadoop(单节点)

    1.Hadoop简介 Hadoop是一个由Apache基金会所开发的开源分布式系统基础框架,使用Java开发,是处理大规模数据的软件平台. Hadoop可以从单一节点扩展到上千节点.用户可以在不了解分 ...

  6. Python常用模块系列

    1.时间模块 import time,datetime # print(time.time()) #时间戳 # print(time.strftime("%Y-%m-%d %X") ...

  7. PHP实现RSA2加密

    PHP实现RSA2加密 1. 需要开启php的 php_openssl扩展 <?php /* * RSA2签名 * @param array 请求的参数 * @param string 私钥 * ...

  8. linux中常用的命令大全

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  9. requests返回页面乱码

    req=requests.post(domain,params,json=None) req=req.content.decode()

  10. python基础之基础数据类型1

    int 整形 数字用于计算和比较 python3没有long,python2有整形和长整型 十进制二进制转换方法 bin(10进制) ==二进制 0b(二进制) int("二进制" ...