有一个有300个座位的圆,现在给出n个两个人间的座位信息,问有几个信息是错误的。
当一个信息和前面的信息矛盾被认为是错误的。
一个模300系的带权并查集。势能高的向势能低的树合并,合并时压缩路径并将相对于根节点的势能更新。
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) #define LMissher using namespace std; typedef long long ll; typedef double db; const int M = 1e5+7; const double pi = acos(-1); const int inf = 2147483647; const int mod = 300; int n,m; int f[M],pos[M]; void init(){ for(int i=1;i<=n;i++) f[i]=i,pos[i]=0; } int find(int x){ if(x==f[x]) return x; int tmp=f[x]; f[x]=find(f[x]); pos[x]=(pos[x]+pos[tmp])%mod; return f[x]; } int main(){ #ifdef LMissher freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif while(~scanf("%d%d",&n,&m)){ init(); int ans=0,u,v,d; while(m--){ scanf("%d%d%d",&v,&u,&d);//v+d=u int fu=find(u),fv=find(v); if(fu==fv){ if((pos[v]+d)%mod!=pos[u]) ans++; } else{ f[fu]=fv; pos[fu]=(pos[v]-pos[u]+d+mod)%mod; } } printf("%d\n",ans); } return 0; }