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

poj 1733 Parity game【哈希+并查集】

时间:2014-08-15 12:55:08      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:并差集基础   hash   

   这道题题意我不想说了,但是有一个条件必须的说,就是1-2其实是0-2这条边,3-4是2-4这条边,但是困惑了好久,其他就是哈希给他一个地址 ,然后把注解看下方


  

#include <stdio.h>
#include <string.h>
#define  maxx 10001
int par[maxx];
int rank[maxx];
void init()
{
     for(int i=0;i<=maxx;i++)
     {
     	rank[i]=0;
     	par[i]=i;
     }
}
int findset(int n)
{
	if(n==par[n])
		return n;;
	int t =findset(par[n]);
	rank[n]=(rank[n]+rank[par[n]])%2;//判断父亲和儿子的奇偶性,并更新他们
     par[n]=t;
     return par[n];
}
int unite(int n,int m,int h)
{
	int pn=findset(n);
	int pm=findset(m);
	if(pn==pm)
	{
		if((rank[n]+rank[m]+h)%2==0)
			return 1;
		else
			return 0;
	}
    else
    {
    	par[pn]=pm;
    	rank[pn]=(rank[n]+rank[m]+h)%2;
    	return 1;
    }
}
int hash[maxx];
int aa=0;
int main ()
{
	int N;
	int M;
	scanf("%d",&N);
	init();
	scanf("%d",&M);
	int a,b;
	char s[10];
	int hh;
	int j;
	for(j=0;j<M;j++)
	{
		int px=0,py=0;
       scanf("%d%d%s",&a,&b,s);
       if(s[0]=='o')  hh=1;
       else    hh=0;
       a--;
       hash[0]=0;
       for(int i=0;i<=aa;i++)//用哈希给他们地址
       {
         if(hash[i]==a)
         {
         	px=i;
         	break;
         }
       }
       if(px==0&&a!=0)
       {
          aa++;
          hash[aa]=a;
          px=aa;
       }
       for(int i=0;i<=aa;i++)
       {
         if(hash[i]==b)
         {
         	py=i;
         	break;
         }
       }
       if(py==0&&b!=0)
       {
          aa++;
          hash[aa]=b;
          py=aa;
       }
       if(unite(px,py,hh)==0)  break;
  	}
    printf("%d\n",j);
}

poj 1733 Parity game【哈希+并查集】,布布扣,bubuko.com

poj 1733 Parity game【哈希+并查集】

标签:并差集基础   hash   

原文地址:http://blog.csdn.net/u013076044/article/details/38582329

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