这道题,在前一道题目的基础上,好理解多了,个人在代码中写了自己的一点理解

也算是一个拓展应用吧,个人感觉对并查集有了更深的理解了,具体怎么样,继续做题看看吧

大牛还给了一个一般情况下维护偏移量的公式

感谢这位大牛分享:

这里将两个集合并起来并将所挂集合偏移量指向:
kind[b]=(kind[x]-kind[y]+4)%3;
想想上一题是不是也很类似呢
其实上一题的公式也可以改成
kind[b]=(kind[x]-kind[y]+3)%2;
不管是几个动物循环,都能得到类似的结论,所以以后碰到4,5,6,7。。。个动物的食物链,你应该也会做了吧?^_^

View Code

#include<stdio.h>#define MAXN 50010int f[MAXN],r[MAXN],n;int find(int x){if(x==f[x])return x;int t=find(f[x]);    r[x]=(r[x]+r[f[x]])%3;//由x与父节点的关系以及父节点与根节点的关系,推出x与根节点的关系    f[x]=t;return f[x];}int Union(int x,int y,int c){if(x>n||y>n)return 1;int a=find(x),b=find(y);if(c==1)    {if(a==b)        {if(r[x]!=r[y])//不同类的情况                return 1;        }else {            f[b]=a;            r[b]=(r[x]-r[y]+3)%3;//x与y为同类的情况,注意,将a并到b上,与将b并到a上对应的公式是不同的//再补充一下,突然发现,还可以理解,这里由于x与y已经为同类的了,所以还是可以推出来的        }    }else {if(x==y) return 1;//自己吃自己,属于假话        if(a==b)        {if((r[x]+1)%3!=r[y])//r[x]+1==r[y]表示x吃y,当然,还要考虑r[x]==2,r[y]==0的情况,所以对3取模                return 1;        }else {            f[b]=a;            r[b]=(r[x]-r[y]+4)%3;//公式,具体如何推来的,额,还没发现过有大牛解释,不过,结合上一篇文章的解释,还是可以理解的        }    }return 0;}int main(){int i,k,c,x,y,sum=0;    scanf("%d %d",&n,&k);for(i=1;i<=n;i++)    {        f[i]=i;        r[i]=0;    }for(i=1;i<=k;i++)        {            scanf("%d %d %d",&c,&x,&y);if(Union(x,y,c))//返回值为真,则累加                sum++;        }        printf("%d\n",sum);return 0;}

以上部分解释来自此链接http://www.cppblog.com/abilitytao/archive/2010/05/14/98899.html

hdu3047Zjnu Stadium

题意:已知N个人围成一个圈,现在给出m条指令,形如A,B,C,即B在A的顺时针方向第C个

判断中间有几条指令是错误的

分析:很明显的用并查集俩做,根据指令,用一个r[]数组保存每一个人到根节点的相对位置,

这样,每给出一条指令,若俩个人在同一个集合,则可以根据他们各自的到根节点的距离计算出是否与指令一致

若不在同一个集合,则合并,同时计算俩个集合的根节点的相对距离,,其余节点之间的相对距离在找出过程中计算,这个跟之前的题目类似。

忽略了一点,狂WA 了啊,就是这N个人是围成圈的,所有计算相对距离的时候要mod300

View Code

#include<iostream>#include<algorithm>#define MAXN 50000+10using namespace std;int f[MAXN],r[MAXN],n,m;void init(){for(int i=0;i<=n;i++)    {        f[i]=i;        r[i]=0;    }}int find(int x){if(x==f[x])return f[x];int t=find(f[x]);    r[x]=(r[x]+r[f[x]])%300;    f[x]=t;return f[x];}bool Union(int x,int y,int w){int a=find(x);int b=find(y);if(a==b)    {if((r[y]-r[x]+300)%300==w)return true;return false;    }    f[b]=a;    r[b]=(r[x]+w-r[y]+300)%300;return true;}int main(){int a,b,c;while(scanf("%d %d",&n,&m)==2)    {int ans=0;        init();while(m--)        {            scanf("%d %d %d",&a,&b,&c);if(!Union(a,b,c))                ans++;        }        printf("%d\n",ans);    }return 0;}

转载于:https://www.cnblogs.com/nanke/archive/2011/05/04/2036929.html

pku1182(食物链) hdu3047 Zjnu Stadium相关推荐

  1. HDU3047 Zjnu Stadium

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. 带权并查集--hdu3047 ZJnu stadium

    题意:给出一个n,m,n表示的是有n 个人,m表示的是 有m 对关系: 接下来输入的就是这m对关系,a,b,x:表示的是a,b相距x个距离:然后判断输入的是否与这个数的上面的数信息一致, 输出不一致的 ...

  3. HDU 3047 Zjnu Stadium (带权并查集)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...

  4. Zjnu Stadium HDU - 304 加权并查集

    题意: 观众席围成一圈.列的总数是300,编号为1–300,顺时针计数,我们假设行的数量是无限的.将有N个人去那里.他对这些座位提出了要求:这意味着编号A的顺时针X距离坐着编号B.例如:A在第4列,X ...

  5. Hdoj 3047 Zjnu Stadium

    题目传送门 //求解本题需要弄清楚冲突发生的条件,很容易看出此题为种类并查集的变种,题上提到了距离,自然想到是带权值的并查集,关键是这个权值怎么办. //菜鸟参考网上各位大牛的解法终于懂了这道题的前因 ...

  6. hdu 3047 Zjnu Stadium(并查集)

    题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...

  7. HDU 3047 Zjnu Stadium

    传送门 带权并查集,和POJ 1182很像. 一个圆形体育场,座椅也是圆形排列的,总共有300列,无穷多行,给你N个观众编号1~N,再给M个安排,每个安排是说B观众所在的列号等于A观众所在的列号加X( ...

  8. python 来源软件应急处理_Mac遇到挖矿程序的应急方法

    如何编写自己的Arduino库? 一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了.一直想搞清楚,以便编写自己的库文件.于是研究一下午,下面是一些总结. Arduino ...

  9. 树形结构 —— 并查集

    [概述] 并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,一般处理的是图的连通分量,当给出两个的元素的一个无序对 (a,b) 时,需要快 ...

最新文章

  1. 渗透测试-getshell方法总结
  2. Java 基础 之 关系运算符
  3. 为什么 C+标准每三年发布一次?
  4. Linux下修改命令提示符
  5. 程序员如何保持身心健康
  6. Vim winmanager文件浏览自动更新
  7. var obj = eval(result); 解析json
  8. webservice采用ssl/https传输
  9. html 预加载图片,实现网页图片预加载的几个方法
  10. #TCP你学得会# Wireshark中的TCP Spurious Retransmission
  11. DeepFM 参数理解(二)
  12. 云片网短信服务使用Java
  13. Protecting Against DNN Model Stealing Attacks 论文阅读心得
  14. python发送短信接口_python 调用接口发短信
  15. 无为而无不为和企业管理
  16. 统一社会信用代码=营业执照注册号 + 营业执照注册号+营业执照注册号
  17. 美的集团的命,智能家居来续?
  18. 给联想拯救者15isk装win7遇到的问题
  19. Vue-全局websocket 实现消息推送
  20. mos管的rc吸收电路计算_一种反激式开关电源中MOS管的RC吸收电路的制作方法

热门文章

  1. python中的散点图代码-python – 带有图例的matplotlib散点图
  2. 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程
  3. python输出csv文件-更高效的Python CSV文件导出
  4. python中文软件-Python3.8.3下载
  5. python程序员需要掌握哪些技术-python运维要掌握哪些内容
  6. python流程图-python中的图表渲染(流程图可视化)
  7. python是干什么用的视频-python基础教程千锋最新视频学完之后可以做什么
  8. 学python要考什么证-学python需要考证吗?考证有什么好处?
  9. 小白学python买什么书-小白如何高效率学习python?真心建议(附教程)
  10. python下载文件到指定文件夹-Python 获取指定文件夹下的目录和文件的实现