种类并查集——带权并查集——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\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
随机推荐
- hdu 3415(单调队列) Max Sum of Max-K-sub-sequence
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415 大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列.这个连续子序列的长度小于等于k. ...
- Linux下网络排查之ping|traceroute|mtr工具(zz)
1.ping ping使用了ICMP回送请求和回送应答报文.ping工具发出去的数据包没有通过tcp/udp协议,但是要经过ip协议.ping命令计算的时间是数据包的往返总时间. ping命令常用 ...
- BZOJ1226或洛谷2157 [SDOI2009]学校食堂
BZOJ原题链接 洛谷原题链接 注意到\(B[i]\)很小,考虑状压\(DP\). 设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到 ...
- Linux中处理字符串
获取字符串长度: ${#字符串变量名} 截取子串: 1. expr substr 字符串 起始位置 截取长度 2. 命令输出 | cut -c 起始位置-结束位置 命令输出 | cut -c &quo ...
- win32 注册表操作
创建键 RegCreateKeyEx int SetRecordVideoSavedDays(int newSavedDays) { HKEY hSubKey = NULL; LONG lRet = ...
- MZOJ 1345 hero
一道宽搜模版题,可写错了两个地方的我只得了56(掩面痛哭) http://10.37.2.111/problem.php?id=1345 先看看正确的 #include <bits/stdc++ ...
- mybatis分页插件Mybatis_PageHelper 简单案例
源码地址(官网,文档) 使用条件: 支持mybatis 3.1.0+ sql 解析工具(jsqlparser.jar) 下载 Mybatis_PageHelper 版本随意,反正我用的5.0.0 m ...
- 2019.02.09 bzoj2839: 集合计数(容斥原理)
传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk种方案 ...
- 2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)
传送门 树链剖分一眼题. 题意简述: 给定一棵树,有三种操作: 加入一条路径 删除一条已加入的路径 询问不过一个点x的路径的最大值. 思路: 直接树链剖分维护答案. 因为询问的事不过点xxx的最大值, ...
- 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)
传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...