传统弱校HFUT的蒟蒻,真相只有一个

并查集

并查集模板

#include<cstdio>
#define max 100000
int N,K;
int T[max],X[max],Y[max];
int par[max],rank[max];
void init(int n)
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
        rank[i]=0;
    }
}

int find(int x)
{
    if(par[x]==x)
    {
        return x;
    }
    else
    {
        return par[x]=find(par[x]);
    }
}

void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return;
    if(rank[x]<rank[y])
    {
        par[x]=y;
    }
    else
    {
        par[y]=x;
        if(rank[x]==rank[y]) rank[x]++;
    }
}

bool same(int x,int y)
{
    return find(x)==find(y);
}

void solve()
{
    init(N*3);
    int ans=0;
    for(int i=0;i<K;i++)
    {
        int t=T[i];
        int x=X[i]-1;
        int y=Y[i]-1;
        if(x<0||N<=x||y<0||N<=y)
        {
            ans++;
            continue;
        }            
        if(t==1)
        {
            if(same(x,y+N)||same(x,y+2*N)) ans++;
            else
            {
                unite(x,y);
                unite(x+N,y+N);
                unite(x+N*2,y+N*2);
            }
        }
        else
        {
            if(same(x,y)||same(x,y+2*N))
            {
                ans++;
            }
            else
            {
                unite(x,y+N);
                unite(x+N,y+2*N);
                unite(x+2*N,y);
            }
        }
    }
    printf("%d\n",ans);
}

int main()
{
    scanf("%d %d",&N,&K);
    for(int i=0;i<K;i++)
    {
        scanf("%d %d %d",&T[i],&X[i],&Y[i]);
    }
    solve();
    return 0;
}
//poj 1182
View Code

posted @ 2016-01-26 23:14  未名亚柳  阅读(129)  评论(0编辑  收藏  举报