食物链(并查集)

题目在这里
AC代码:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const   int N=100010;
int d[N],p[N];
int find(int x)
{
   
    if(x!=p[x])
    {
   
        int t=find(p[x]);
        d[x]+=d[p[x]];
        p[x]=t;
    }
    return p[x];
}
int main()
{
   
    int res=0;
    int m,n;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    p[i]=i;
    while(m--)
    {
   
       int a,b,c;
       cin>>a>>b>>c;
       int px=find(b),py=find(c);
       if(b>n||c>n)
       res++;
       
       else if(a==1)
       {
   
           if(px==py&&(d[c]-d[b])%3)
           {
   
               res++;
           }
           else if(px!=py)
           {
   
               p[px]=py;
               d[px]=d[c]-d[b];
           }
       }
       else{
   
           if(b==c) res++;
           else if(px==py&&(d[c]-d[b]-1)%3)
           {
   
               res++;
           }
           else if(px!=py)
           {
   
            p[px]=py;
            d[px]=d[c]-d[b]-1;
           }
       }
    }
    printf("%d\n",res);
    return 0;
}
全部评论

相关推荐

10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务