这道题题意我不想说了,但是有一个条件必须的说,就是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
原文地址:http://blog.csdn.net/u013076044/article/details/38582329