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的更多相关文章

  1. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  2. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  3. Poj1182 食物链(并查集/带权并查集)

    题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...

  4. 【并查集&&带权并查集】BZOJ3296&&POJ1182

    bzoj1529[POI2005]ska Piggy banks [题目大意] n头奶牛m种语言,每种奶牛分别掌握一些语言.问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流? [思路] ( ...

  5. codeforces 687D Dividing Kingdom II 带权并查集(dsu)

    题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...

  6. AcWing:238. 银河英雄传说(带权并查集)

    有一个划分为N列的星际战场,各列依次编号为1,2,…,N. 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列. 有T条指令,每条指令格式为以下两种之一: 1.M i j,表示让第i号战 ...

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

  8. A Bug's Life POJ - 2492 (种类或带权并查集)

    这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做. 题目大意:输入x,y表示x和y交配,然后判断是否有同性恋. 1 带权并查集: 我们可以用边的权值来表示一种 ...

  9. AcWing 239.奇偶游戏 (带权并查集/种类并查集)

    题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...

随机推荐

  1. PHP 异步使用swoole的可行性测试

    PHP的异步.并行.高性能网络通信引擎swoole框架,在一开始我就比较注意,原因无他,php在swoole未出的情况下在多线程调度上确实算得上没有较好的解决方案. 我以系统的注册流程举例,在比较复杂 ...

  2. FPKM与RPKM

    FPKM与RPKM (2015-01-09 23:55:17) 转载▼ 标签: 转载   原文地址:FPKM与RPKM作者:Fiona_72965 定义:  FPKM:Fragment Per Kil ...

  3. 生成器(generator)

    1. 什么是生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且, 创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元 ...

  4. VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

  5. 如何查看api项目接口

    http://www.api.com/Api/Page/index/?format_type=json&api_cate=cms&ma=8026

  6. 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 ...

  7. 安装ubuntu16.04的时候出现的detecting file system

    解决问题方法是,进入主界面执行,如下操作即可: sudo umount -l /isodevice

  8. How to Create Triggers in MySQL

    https://www.sitepoint.com/how-to-create-mysql-triggers/ I created two tables: CREATE TABLE `sw_user` ...

  9. JS Async Callback

    AsyncCallback 意义: 异步操作完成时调用的方法 语法1: 构造异步回调对象 AsyncCallback 异步回调对象名asyncCallback = new AsyncCallback( ...

  10. 常见CSS

    .login_top_bg { background-image: url(/pcssc/images/login/login-top-bg.gif); background-repeat: repe ...