Timus 1003 并查集

并查集 讲解看如下博客:

http://start07.yo2.cn/articles/ural-1003-parity.html

#include<iostream>

#include<cstring>

#include<cstdio>

using namespace std;

#define BLOCK 10000

int HashTable[20000],father[20000],Rank[20000],N;

int Hash(int a)

{

    int i;

    for(i=1;i<N;i++)

        if(HashTable[i]==a) return i;

    HashTable[N]=a;

    return N++;

}

int find(int x)

{

    while(x!=father[x]) x=father[x];

    return x;

}

int Union(int a,int b)

{

    int x,y;

    x=find(a); y=find(b);

    if(Rank[x]>Rank[y])

    {

        father[y]=x;

        Rank[x]+=Rank[y];

    }

    else

    {

        father[x]=y;

        Rank[y]+=Rank[x];

    }

    return 0;

}

int main()

{

    int i,m,n,s,t;

    char mark[20];

    while(scanf("%d",&n) && n!=-1)

    {

        N=1;

        for(i=1;i<20000;i++)

        {

            father[i]=i; Rank[i]=1;

        }

        scanf("%d",&m);

        for(i=1;i<=m;i++)

        {

            scanf("%d %d %s",&s,&t,mark);



            s=Hash(s-1);  t=Hash(t);

            if(strcmp(mark,"even")==0)

            {

                 if(find(s)==find(t+BLOCK)) break;

                 Union(s,t);

                 Union(s+BLOCK,t+BLOCK);

            }

            else

            {

                if(find(s)==find(t)) break;

                Union(s,t+BLOCK);

                Union(t,s+BLOCK);

            }

        }

        printf("%d\n",i-1);

        for(i++;i<=m;i++) scanf("%d %d %s",&s,&t,mark);

    }

    return 0;

}

 

 

你可能感兴趣的:(并查集)