种类并查集——带权并查集——POJ1182;HDU3038
这两个题比较像(一类题目),属于带权(种类)并查集
poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛盾
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int maxn = 5e4 + 5e2;
int pre[maxn],rel[maxn];
int N,K,ans;
带权并查集,rel就是存储得权值,表示得时当前动物和根动物得关系
void init()
{
for(int i = 0;i <= N;i++)
{
pre[i] = i;
rel[i] = 0;
}
ans = 0;
}
这一步时初始化处理
int Find(int x)
{
if(x != pre[x])
{
int tem = pre[x];
pre[x] = Find(tem);
rel[x] = (rel[x] + rel[tem] ) % 3;
}
return pre[x];
}
按照向量得计算,在路径压缩得时候(递归)进行权值(关系)得更新
void join(int a,int b,int r)
{
int ra = Find(a);
int rb = Find(b);
if(ra == rb)
{
if((rel[a] - rel[b] + 3) % 3 != r)ans++;
}
else
{
pre[ra] = rb;
rel[ra] = (r - rel[a] + rel[b] + 3) % 3;
}
}
如果对于两个给出得关系,他们已经时一个集合得时候,就可以进行谎话得判断,否则呢,连接老大(未出现的,默认为真),新增权值更新;之后呢,这个结点中所有权值得更新都会放在find函数中进行路径压缩得时候进行实现
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int maxn = 5e4 + 5e2;
int pre[maxn],rel[maxn];
int N,K,ans;
void init()
{
for(int i = 0;i <= N;i++)
{
pre[i] = i;
rel[i] = 0;
}
ans = 0;
}
int Find(int x)
{
if(x != pre[x])
{
int tem = pre[x];
pre[x] = Find(tem);
rel[x] = (rel[x] + rel[tem] ) % 3;
}
return pre[x];
}
void join(int a,int b,int r)
{
int ra = Find(a);
int rb = Find(b);
if(ra == rb)
{
if((rel[a] - rel[b] + 3) % 3 != r)ans++;
}
else
{
pre[ra] = rb;
rel[ra] = (r - rel[a] + rel[b] + 3) % 3;
}
}
int main()
{
scanf("%d%d",&N,&K); init();
int a,b,r;
while(K--)
{
scanf("%d%d%d",&r,&a,&b);
if((a == b && r == 2) || a > N || b > N)
{
ans++;
continue;
}
r--;
join(a,b,r);
}
printf("%d\n",ans); return 0;
}
其实这个题比POJ1182难
poj1182,比较明显,权值得意义就是区间长度,问你有几处错误为了使得给出得区间能覆盖,所以可以让左端点--,或者右端点++,其他的真的差不多
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn = 2e5 + 2e3;
int pre[maxn],ans[maxn];
int N,M,ret;
void init()
{
for(int i = 1;i <= N + 1;i++)
{
pre[i] = i;
ans[i] = 0;
}
ret = 0;
}
int Find(int x)
{
if(x != pre[x])
{
int tem = pre[x];
pre[x] = Find(tem);
ans[x] += ans[tem];
}
return pre[x];
}
void join(int a,int b,int x)
{
int ra = Find(a);
int rb = Find(b);
if(ra == rb)
{
if(ans[a] - ans[b] != x)ret++;
}
else
{
pre[ra] = rb;
ans[ra] = x + ans[b] - ans[a];
}
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
init();
int a,b,x;
while(M--)
{
scanf("%d%d%d",&a,&b,&x);
b++;//防止使得边界重合,易于去判断错误
join(a,b,x);
}
printf("%d\n",ret);
}
return 0;
}
种类并查集——带权并查集——POJ1182;HDU3038的更多相关文章
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- Poj1182 食物链(并查集/带权并查集)
题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...
- 【并查集&&带权并查集】BZOJ3296&&POJ1182
bzoj1529[POI2005]ska Piggy banks [题目大意] n头奶牛m种语言,每种奶牛分别掌握一些语言.问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流? [思路] ( ...
- codeforces 687D Dividing Kingdom II 带权并查集(dsu)
题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...
- AcWing:238. 银河英雄传说(带权并查集)
有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...
- POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】
The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the ...
- A Bug's Life POJ - 2492 (种类或带权并查集)
这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做. 题目大意:输入x,y表示x和y交配,然后判断是否有同性恋. 1 带权并查集: 我们可以用边的权值来表示一种 ...
- AcWing 239.奇偶游戏 (带权并查集/种类并查集)
题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
随机推荐
- PHP 异步使用swoole的可行性测试
PHP的异步.并行.高性能网络通信引擎swoole框架,在一开始我就比较注意,原因无他,php在swoole未出的情况下在多线程调度上确实算得上没有较好的解决方案. 我以系统的注册流程举例,在比较复杂 ...
- FPKM与RPKM
FPKM与RPKM (2015-01-09 23:55:17) 转载▼ 标签: 转载 原文地址:FPKM与RPKM作者:Fiona_72965 定义: FPKM:Fragment Per Kil ...
- 生成器(generator)
1. 什么是生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且, 创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元 ...
- VS2010下MFC的串口编程
串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...
- 如何查看api项目接口
http://www.api.com/Api/Page/index/?format_type=json&api_cate=cms&ma=8026
- Sliding Window Median LT480
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- 安装ubuntu16.04的时候出现的detecting file system
解决问题方法是,进入主界面执行,如下操作即可: sudo umount -l /isodevice
- How to Create Triggers in MySQL
https://www.sitepoint.com/how-to-create-mysql-triggers/ I created two tables: CREATE TABLE `sw_user` ...
- JS Async Callback
AsyncCallback 意义: 异步操作完成时调用的方法 语法1: 构造异步回调对象 AsyncCallback 异步回调对象名asyncCallback = new AsyncCallback( ...
- 常见CSS
.login_top_bg { background-image: url(/pcssc/images/login/login-top-bg.gif); background-repeat: repe ...