标签:microsoft -- div str sed ini std color font
带权并查集食物链(模3系),三个物种,给一些关系,同类、被吃、吃。问哪些关系是错的。
同类关系是0,点吃根节点的关系是1,根节点吃点关系是2即可。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; const int M = 5e4+7; int n,q; int f[M],cnt[M]; void init(){ for(int i=0;i<=n;i++) f[i]=i,cnt[i]=0; } int find(int x){ if(x==f[x]) return x; int tmp=f[x]; f[x]=find(f[x]); cnt[x]=(cnt[x]+cnt[tmp])%3; return f[x]; } int u,v,fu,fv,ans,op; int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d%d",&n,&q); ans=0; init(); while(q--){ scanf("%d%d%d",&op,&u,&v);op-=1; if(u>n||v>n||(u==v&&op==1)){ ans++;continue; } fu=find(u),fv=find(v); if(fu==fv){ if((cnt[u]-cnt[v]+3)%3!=op) ans++;//u和v与根节点的距离之差和给的关系不同则是liar } else{ f[fu]=fv; cnt[fu]=(cnt[v]-cnt[u]+op+3)%3;//op是u和v关于新根节点的距离之差,把u的根挂到v的根上 } } printf("%d\n",ans); return 0; }
标签:microsoft -- div str sed ini std color font
原文地址:https://www.cnblogs.com/LMissher/p/9643828.html