poj1182 食物链(路径压缩(向量偏移)扩展并查集)

和之前那个模板道理是一样的:https://blog.csdn.net/qq_38367681/article/details/81257566;

直接上代码:


#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=50000+100;
int pa[MAXN];
int v[MAXN];
int findset(int x)
{
    if(pa[x]==-1)return x;
    int temp=findset(pa[x]);
    v[x] =(v[x]+v[pa[x]] )%3;
    return pa[x]=temp;
}
 
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    memset(pa,-1,sizeof(pa));
    memset(v,0,sizeof(v));
    int ans=0;
    while(k--)
    {
        int d,x,y;
        scanf("%d%d%d",&d,&x,&y);
        int fx=findset(x);
        int fy=findset(y);
        if(x>n||y>n)
        {
            ans++;
            continue;
        }
        if(fx==fy)//同类则在一棵树上,不用合并
        {
            if(d==1 && v[x]!=v[y]) ans++;
            if(d==2 && ( (v[x]+1)%3 ) !=v[y] ) ans ++;
        }
        else
        {
            if(d==1)
            {
                pa[fy]=fx;
                v[fy]=(v[x]-v[y]+3)%3;
            }
            else if(d==2)
            {
                pa[fy]=fx;
                v[fy]=(v[x]-v[y]+1+3)%3;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38367681/article/details/81259081
今日推荐