正题
大意
一个圆形300米的操场,外面位置无数排的椅子,然后给出一些条件,形式为:
A B x ABx
意思为A在B的顺时针方向第x个,求有多少个要求无法满足
解题思路
用并查集,然后一个farfar数组表示离它的fatherfather有多远,每次压缩路径。之后如果输入的A和B在一个分量内就进行判断
(far[x]+w)%≠far[y](far[x]+w)%≠far[y]
这样就累加不满足的条件。
不然就进行连接
(far[x]−far[y]+w+300)%300(far[x]−far[y]+w+300)%300
这样计算连接之后的距离,而且防止了负数情况
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,x,y,w,father[50001],far[50001],s;
int find(int x)
{if (father[x]==x) {return x;}else{int fa=father[x];father[x]=find(father[x]);far[x]=(far[x]+far[fa])%300;//压缩路径return father[x];}
}
void unionn(int x,int y,int w)
{int fa=find(x),fb=find(y);father[fb]=fa;far[fb]=(far[x]-far[y]+w+300)%300;//连接两点
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)father[i]=i;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&w);if (find(x)==find(y)){if ((far[x]+w)%300!=far[y]) s++;//统计}elseunionn(x,y,w);//连接}printf("%d",s);
}