题目链接:http://poj.org/problem?id=1182

题意:题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与当前话冲突的,即认为其为真话  )。每句话开始都有三个数 D A B,当D = 1时,表示A 和B是同类,当D = 2时表示A 吃 B。

思路:

想了好久也没有思路,数据量这么大,感觉只能用并查集来完成,之后参考了巨巨的博客:https://www.cnblogs.com/liuxin13/p/4668205.html。

不禁赞叹,真的是好题啊。好了,这道题是一个带权并查集的题。对于每一句话,首先可能出现直接能判定为假的情况,即输入的数有大于n的或者D=2且A=B时。之后就需要并查集了。不访设A->B的关系中0表示同类、1表示A吃B、2表示A被B吃。则输入的D减一后即代表A->B表示的关系,现在就将需要把有关系的点并在一起,用root[i]表示点i的祖先,f[i]表示点i与其祖先的关系,可能为0,1,2。

接下来先推一个公式:

这样题目就可以继续进行了。输入d a b,用ra,rb表示a,b的祖先。若能直接判断为假话,则++res,继续下一句话,否则:

1.ra!=rb:那么将a,b合并。路径:root[rb]=ra。关系:f[rb]=rb->ra=(rb->a+a->ra)%3=((6-a->b-b->rb)%3+a->ra)%3=(6-a->b-b->rb+a->ra)%3=(6-(d-1)+f[a]-f[b])%3。

2.ra==rb:查询a->b是否等于(d-1)。判断f[a]==((d-1)+f[b])%3是否成立,若不成立则为错话。

在getr函数中要路径压缩和权值压缩(看代码,由上面推的公式就明白了)。

详见代码:

 #include<cstdio>
using namespace std; int n,k,res,d,a,b;
int root[],f[]; int getr(int kk){
if(root[kk]==kk) return kk;
else{
int tmp=root[kk];
root[kk]=getr(root[kk]);
f[kk]=(f[kk]+f[tmp])%;
return root[kk];
}
} int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i)
root[i]=i,f[i]=;
while(k--){
scanf("%d%d%d",&d,&a,&b);
int ra=getr(a),rb=getr(b);
if(a>n||b>n||(d==&&a==b))
++res;
else if(ra==rb){
if(f[a]!=(d-+f[b])%)
++res;
}
else{
root[rb]=ra;
f[rb]=(-(d-)+f[a]-f[b])%;
}
}
printf("%d\n",res);
return ;
}

poj1182(带权并查集)的更多相关文章

  1. poj1182 带权并查集

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 60225   Accepted: 17656 Description ...

  2. 种类并查集——带权并查集——POJ1182;HDU3038

    POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...

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

    题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...

  4. 【带权并查集】poj1182 食物链

    带权并查集,或者叫做种类并查集,经典题. http://blog.csdn.net/shuangde800/article/details/7974668 这份代码感觉是坠吼的. 我的代码是暴力分类讨 ...

  5. 【POJ1182】 食物链 (带权并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  6. 带权并查集 poj1182

    首先要注意核心代码 int find(int i){    if(i == fa[i])        return fa[i];    int tt = find(fa[i]);    num[i] ...

  7. poj1182食物链,经典带权并查集

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...

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

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

  9. poj1182 食物链 带权并查集

    题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...

随机推荐

  1. 原来zabbix监控进程与端口是如此的简单!

    使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key. ...

  2. Flex 学习

    Flex案例一: <html> <head> <meta http-equiv="Content-Type" content="text/h ...

  3. CA单向认证和双向认证的区别?

    1:单向认证,内容会被串改吗?

  4. C++中关于class B:A与Class B::A问题

    一,class B:A为类的继承关系,即A类是B类的基类class <派生类名>:<继承方式><基类名>{<派生类新定义成员>}; 例如: #inclu ...

  5. 基于Vue的Ui框架

    基于Vue的Ui框架 饿了么公司基于vue开的的vue的Ui组件库 Element Ui 基于vue pc端的UI框架 http://element.eleme.io/ MintUi 基于vue 移动 ...

  6. express 3.5 Err: request aborted

    在处理app传过来的图片时遇到的,顾名思义,就是请求中断,图片在传输过程中遇到了网络不良问题,express 3.5 的中间件 bodyParser会在我们操作这些图片之前接收它们,接收过程中传输中断 ...

  7. 解决 php 报错 open_basedir restriction in effect或者nginx提示No input file specified怎么办

    解决 php 报错 open_basedir restriction in effect或者nginx提示No input file specified怎么办 问题是出现在了PHP.INI上面了 ,原 ...

  8. 关于BeautifulSoup类中的tag对象的string和text属性

    <dl> <dt> 今开 </dt><dd class="s-down">3.87</dd> </dl> & ...

  9. leetcode100

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  10. VB6 实现命令行调用时附着到原控制台

    Public Declare Function AttachConsole Lib "kernel32.dll" (ByVal ProcessID As Integer) As B ...