pku1182(食物链) hdu3047 Zjnu Stadium
这道题,在前一道题目的基础上,好理解多了,个人在代码中写了自己的一点理解
也算是一个拓展应用吧,个人感觉对并查集有了更深的理解了,具体怎么样,继续做题看看吧
大牛还给了一个一般情况下维护偏移量的公式
感谢这位大牛分享:
这里将两个集合并起来并将所挂集合偏移量指向:
kind[b]=(kind[x]-kind[y]+4)%3;
想想上一题是不是也很类似呢
其实上一题的公式也可以改成
kind[b]=(kind[x]-kind[y]+3)%2;
不管是几个动物循环,都能得到类似的结论,所以以后碰到4,5,6,7。。。个动物的食物链,你应该也会做了吧?^_^
#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
#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相关推荐
- HDU3047 Zjnu Stadium
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 带权并查集--hdu3047 ZJnu stadium
题意:给出一个n,m,n表示的是有n 个人,m表示的是 有m 对关系: 接下来输入的就是这m对关系,a,b,x:表示的是a,b相距x个距离:然后判断输入的是否与这个数的上面的数信息一致, 输出不一致的 ...
- HDU 3047 Zjnu Stadium (带权并查集)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...
- Zjnu Stadium HDU - 304 加权并查集
题意: 观众席围成一圈.列的总数是300,编号为1–300,顺时针计数,我们假设行的数量是无限的.将有N个人去那里.他对这些座位提出了要求:这意味着编号A的顺时针X距离坐着编号B.例如:A在第4列,X ...
- Hdoj 3047 Zjnu Stadium
题目传送门 //求解本题需要弄清楚冲突发生的条件,很容易看出此题为种类并查集的变种,题上提到了距离,自然想到是带权值的并查集,关键是这个权值怎么办. //菜鸟参考网上各位大牛的解法终于懂了这道题的前因 ...
- hdu 3047 Zjnu Stadium(并查集)
题意: 300个座位构成一个圈. 有N个人要入座. 共有M个说明 :A B X ,代表B坐在A顺时针方向第X个座位上.如果这个说明和之前的起冲突,则它是无效的. 问总共有多少个无效的. 思路: 并查集 ...
- HDU 3047 Zjnu Stadium
传送门 带权并查集,和POJ 1182很像. 一个圆形体育场,座椅也是圆形排列的,总共有300列,无穷多行,给你N个观众编号1~N,再给M个安排,每个安排是说B观众所在的列号等于A观众所在的列号加X( ...
- python 来源软件应急处理_Mac遇到挖矿程序的应急方法
如何编写自己的Arduino库? 一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了.一直想搞清楚,以便编写自己的库文件.于是研究一下午,下面是一些总结. Arduino ...
- 树形结构 —— 并查集
[概述] 并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,一般处理的是图的连通分量,当给出两个的元素的一个无序对 (a,b) 时,需要快 ...
最新文章
- 渗透测试-getshell方法总结
- Java 基础 之 关系运算符
- 为什么 C+标准每三年发布一次?
- Linux下修改命令提示符
- 程序员如何保持身心健康
- Vim winmanager文件浏览自动更新
- var obj = eval(result); 解析json
- webservice采用ssl/https传输
- html 预加载图片,实现网页图片预加载的几个方法
- #TCP你学得会# Wireshark中的TCP Spurious Retransmission
- DeepFM 参数理解(二)
- 云片网短信服务使用Java
- Protecting Against DNN Model Stealing Attacks 论文阅读心得
- python发送短信接口_python 调用接口发短信
- 无为而无不为和企业管理
- 统一社会信用代码=营业执照注册号 + 营业执照注册号+营业执照注册号
- 美的集团的命,智能家居来续?
- 给联想拯救者15isk装win7遇到的问题
- Vue-全局websocket 实现消息推送
- mos管的rc吸收电路计算_一种反激式开关电源中MOS管的RC吸收电路的制作方法
热门文章
- python中的散点图代码-python – 带有图例的matplotlib散点图
- 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程
- python输出csv文件-更高效的Python CSV文件导出
- python中文软件-Python3.8.3下载
- python程序员需要掌握哪些技术-python运维要掌握哪些内容
- python流程图-python中的图表渲染(流程图可视化)
- python是干什么用的视频-python基础教程千锋最新视频学完之后可以做什么
- 学python要考什么证-学python需要考证吗?考证有什么好处?
- 小白学python买什么书-小白如何高效率学习python?真心建议(附教程)
- python下载文件到指定文件夹-Python 获取指定文件夹下的目录和文件的实现