种类并查集——带权并查集——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\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
随机推荐
- yum 安装 php7 ,lamp ,以及安装swoole
1 更新yum yum update 2 安装依赖 yum -y install pcre* openssl* yum -y install gcc make gd-devel libjpeg-dev ...
- Linux renew ip command
$ sudo dhclient -r //release ip 释放IP$ sudo dhclient //获取IP Now obtain fresh IP:$ sudo dhcli ...
- [Robot Framework] Robot Framework里面的变量怎么知道是在哪里定义的?
看变量在哪里定义的:Ctrl+Alt+Space
- Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用
Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019869 ...
- [AI]神经网络章1 神经网络基本工作原理
神经元细胞的数学计算模型 神经网络由基本的神经元组成,下图就是一个神经元的数学/计算模型,便于我们用程序来实现. 输入 (x1,x2,x3) 是外界输入信号,一般是一个训练数据样本的多个属性,比如,我 ...
- 解析vue2.0中render:h=>h(App)的具体意思
render:h=>h(App)是ES6中的箭头函数写法,等价于render:function(h){return h(App);}. 注意点:1.箭头函数中的this是 指向 包裹this所在 ...
- mybatis 插入数据并返回主键值
<insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
- WebSocket的原理与优缺点
websocket 是长连接,受网络限制比较大,需要处理好重连,比如用户进电梯或电信用户打个电话网断了,这时候就需要重连,如果 ws 一直重连不上,有些较复杂的业务方会不愿意的,是不是还要搞个 htt ...
- p1 批梯度下降算法
(蓝色字体:批注:绿色背景:需要注意的地方:橙色背景是问题) 一,机器学习分类 二,梯度下降算法:2.1模型 2.2代价函数 2.3 梯度下降算法 一,机器学习分类 无监督学习和监督学习 无监 ...