码迷,mamicode.com
首页 > 其他好文 > 详细

并查集

时间:2016-01-27 00:45:20      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

并查集模板

技术分享
#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

技术分享

技术分享

技术分享

技术分享

并查集

标签:

原文地址:http://www.cnblogs.com/dzzy/p/5161888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!