P2024-食物链

#include<iostream>
using namespace std;
int f[100001],l[100001],i,j,n,k,x,y,z,ans=0;
int father(int x)
{
    if(x==f[x]) return x;
    else
        {
            int t1;
            t1=f[x];
            f[x]=father(f[x]);
            l[x]=(l[x]+l[t1])%3;
            return f[x];
        }
}
int main()
{
    cin>>n>>k;
    for(i=1;i<=n;i++)
    {
        f[i]=i;l[i]=0;
    }
    for(i=1;i<=k;i++)
    {
        cin>>z>>x>>y;
        if((z==2&&x==y)||(x>n||y>n))        //排除比较简单的假话
        {
            ans++;continue;
        }
        if(z==1)                 //z=1情况
        {
            if(father(x)==father(y))
            {
                if(l[x]!=l[y]) ans++;
            }
            else
            {
                l[f[x]]=(l[y]-l[x]+3)%3;
                f[f[x]]=f[y];
            }
        }
        if(z==2)                //z=2情况
        {
            if(father(x)==father(y))
            {
                if(l[x]!=(l[y]+1)%3) ans++;
            }
            else
            {
                l[f[x]]=(l[y]-l[x]+4)%3;
                f[f[x]]=f[y];
            }
        }
    }
    cout<<ans<<endl;
}
只有三个集合,而且不会反向,一直是A->B->C;
每一个给的条件都是判断这个虫子的集合位置;
给定的距离就3个一轮转圈也没关系%3 就行了,
距离的话就看这虫子有没有反向,只能A->B->C的顺序,
z==1 要在一个集合中,而且距离要满足相等;
z==2 要不再一个集合中,而且满足顺序。。。。。

猜你喜欢

转载自blog.csdn.net/wentong_xu/article/details/80256985