AcWing 240. 食物链

带权并查集,d[x]维护x到父节点的距离
#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+10;

int fa[N],d[N];

int find(int x){
    if(x!=fa[x]){
        int t=find(fa[x]);
        d[x]+=d[fa[x]];
        fa[x]=t;
    }
    return fa[x];
}

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) fa[i]=i;
    int res=0;
    while(m--){
        int a,x,y;
        cin>>a>>x>>y;
        if(x>n || y>n) res++;
        else{
            int u=find(x),v=find(y);
            if(a==1){
                if(u==v && (d[x]-d[y])%3) res++;
                else if(u!=v){
                    fa[u]=v;
                    d[u]=d[y]-d[x];
                }
            }
            else{
                if(u==v && (d[x]-d[y]-1)%3) res++;
                else if(u!=v){
                    fa[u]=v;
                    d[u]=d[y]-d[x]+1;
                }
            }
        }
    }
    cout<<res;
    return 0;
}
posted @ 2022-05-17 20:29  xhy666  阅读(30)  评论(0)    收藏  举报