博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3047 Zjnu Stadium(带权并查集)
阅读量:5062 次
发布时间:2019-06-12

本文共 1653 字,大约阅读时间需要 5 分钟。

题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个。

  给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数。

 

#include 
#include
#include
#include
using namespace std;const int maxn=50010;int n,m,r;int father[maxn];int pos[maxn];//pos[i]表示i相对根节点的位置(始终大于0的,顺时针方向)void init(){ for(int i=1;i<=n;i++){ father[i]=i; pos[i]=0; }}//查找父节点的时候,同步更新子节点相对更节点的位置int find_root(int x){ if(father[x]==x) return x; int fa=father[x]; father[x]=find_root(father[x]); pos[x]=(pos[x]+pos[fa])%300; return father[x];}void Union(int fa,int fb){ father[fb]=fa;}int main(){ int a,b,x; while(scanf("%d%d",&n,&m)!=EOF){ r=0; init(); for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&x); int fa=find_root(a); int fb=find_root(b); if(fa!=fb){ Union(fa,fb); /* b相对a的顺时针位置为x,b相对父节点fb的位置为pos[b],则fb相对b的位置为-pos[b], a相对父节点fa的位置为pos[a]。 fb相对a的位置为-pos[b]+x,fb相对fa的位置即为(-pos[b]+a+pos[a], 这里为防止出现负数,加了300 */ pos[fb]=(x-pos[b]+pos[a]+300)%300; } else{ /* b相对于a的位置 设a、b的根节点为f,则相对a的位置为-pos[a],b相对f的位置为pos[b], 则b相对a的位置为(-pos[a]+pos[b]),这里同样为防止出现负数,加了300 */ int t=(-pos[a]+pos[b]+300)%300; if(t!=x){ r++; } } } printf("%d\n",r); } return 0;}

 

  

转载于:https://www.cnblogs.com/chenxiwenruo/p/3296630.html

你可能感兴趣的文章
NodeJs中npm使用
查看>>
git合并历史提交
查看>>
3、块元素
查看>>
设计模式(第十二式:享元模式)
查看>>
多线程编程(进程和线程)
查看>>
MySQL 修改 root 密码命令
查看>>
c# 保留2位小数
查看>>
BETA 版冲刺前准备
查看>>
js无缝滚动
查看>>
Diameter协议摘要
查看>>
操作系统(一) 操作系统的概念
查看>>
打开utmp文件,访问其中的内容
查看>>
C++基础:纯虚函数和抽象类
查看>>
王者荣耀交流协会第二次Scrum立会
查看>>
设计模式-装饰者模式
查看>>
windows 下命令行关闭进程。
查看>>
fileSave,fileOpen,fileSaveAs
查看>>
VMware虚拟机安装Centos预安装环境图文教程1
查看>>
时钟Demo
查看>>
leetcode 区间合并
查看>>