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

来源:互联网 发布:短信群发网站源码 编辑:程序博客网 时间:2024/06/03 17:29

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


  

#include <stdio.h>#include <string.h>#define  maxx 10001int 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;elsereturn 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);}

0 0
原创粉丝点击