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. poj 2886 (线段树+反素数打表) Who Gets the Most Candies?

    http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...

  2. 看懂 Fiddler 的瀑布图

    最近准备给组内的新同学们分享下 Fiddler 这枚神器,可以讲的地方太多,我打算把一节课讲不完的内容写在博客上,大家可以随便看看.今天先介绍下 Fiddler 的瀑布图. 每个网络请求都会经历域名解 ...

  3. NC 5系自定义显示公式

    1.继承NcInnerFunction(nc.vo.pub.formulaset.function.NcInnerFunction) 在方法中引用父类方法function,并在里面写方法 @Overr ...

  4. tp5查看版本

    5.0 base.php 5.1 echo \think\facade\App::version();//用这行代码查看版本

  5. jquery Nestable 获取改变排序后的json数据 拖动排序

    <script type="text/javascript"> jQuery(function($){ $('.dd').nestable(); $('.dd-hand ...

  6. 9款原型设计工具与Sketch的强强组合,轻松构建交互原型!

    原型设计的发展历史经历了纸上原型.静态线框设计.到现在的可交互式原型.作为设计过程中最初始的阶段,设计师们对原型设计的要求也越来越高.因此,如今的原型设计工具格局也发生了很大的变化. Sketch对于 ...

  7. Django web project

    在virtualenv下 (myvenv) ~/djangogirls$ django-admin startproject mysite . 生成web 工程目录 djangogirls ├───m ...

  8. spring 学习 一 spring 介绍

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  9. unity技巧

    在之前的程序编写过程中,虽然对相关的方法进行了实例化,但是在运行的时候总是会出现“未将对象引用设置到对象的实例”,出现该种问题的原因是由于在实例化后,没有对实例化进行引用赋值,所以导致相关变量无法在其 ...

  10. unity延时函数

    新建一个工具类 public class DelayToInvoke : MonoBehaviour{ public static IEnumerator DelayToInvokeDo(Action ...