poj1733 & Ural 1003 Parity Game (hash+並查集 )

長度爲n的0和1組成的字符串, 然後問第L和R位置之間有奇數個1還是偶數個1.

根據這些回答, 判斷第幾個是錯誤(和之前有矛盾)的。

一旦發現有矛盾了,要馬上跳出循環, 後面的那些數據不用去管他了,否則如果用continue就WA。

#include <iostream>
#include <map>
#include <cstring>
using namespace std;

const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex;   //離散化 

int Find(int x)
{
    if(pre[x]==-1)
        return x;
    int f=Find(pre[x]);
    parity[x]=(parity[x]+parity[pre[x]])%2;
    pre[x]=f;
    return f;
}

bool Query(int x,int y,int odd)
{
     int r1,r2;
     r1=Find(x);
     r2=Find(y);
     if(r1==r2)
     {
         if((parity[x]+parity[y])%2==odd) return 1;
         else return 0;
     }
     else{
     pre[r1]=r2;
     parity[r1]=(parity[x]+parity[y]+odd)%2;
     return 1;
     }
}

void Solve()
{
     int i,x,y,index,idx1,idx2,odd;
     char s[10];
     cin>>n>>p;
     index=0;
     for(i=0;i<p;i++)
     {
         cin>>x>>y>>s;
         x--;
         if(numIndex.find(x)==numIndex.end())
             numIndex[x]=index++;
         idx1=numIndex[x];
         if(numIndex.find(y)==numIndex.end())
             numIndex[y]=index++;
         idx2=numIndex[y];
         if(strcmp(s,"odd")==0) odd=1;
         else odd=0;
         if(Query(idx1,idx2,odd)==false) break;
     }
     cout<<i<<endl;
}

void Init()
{
     memset(pre,-1,sizeof(pre));
}

int main()
{
    Init();
    Solve();
   // system("pause");
    return 0;
}
    

URAL上的AC代碼:

#include <iostream>
#include <map>
#include <cstring>
using namespace std;

const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex;   //離散化 

int Find(int x)
{
    if(pre[x]==-1)
        return x;
    int f=Find(pre[x]);
    parity[x]=(parity[x]+parity[pre[x]])%2;
    pre[x]=f;
    return f;
}

bool Query(int x,int y,int odd)
{
     int r1,r2;
     r1=Find(x);
     r2=Find(y);
     if(r1==r2)
     {
         if((parity[x]+parity[y])%2==odd) return 1;
         else return 0;
     }
     else{
     pre[r1]=r2;
     parity[r1]=(parity[x]+parity[y]+odd)%2;
     return 1;
     }
}



    

int main()
{
     while(cin>>n&&n!=-1)
     {
     memset(pre,-1,sizeof(pre));
     memset(parity,0,sizeof(parity));
     numIndex.clear();
     int i,x,y,index,idx1,idx2,odd;
     char s[10];
     cin>>p;
     index=0;
     for(i=0;i<p;i++)
     {
         cin>>x>>y>>s;
         x--;
         if(numIndex.find(x)==numIndex.end())
             numIndex[x]=index++;
         idx1=numIndex[x];
         if(numIndex.find(y)==numIndex.end())
             numIndex[y]=index++;
         idx2=numIndex[y];
         if(strcmp(s,"odd")==0) odd=1;
         else odd=0;
         if(Query(idx1,idx2,odd)==false) break;
     }
      for(int ii=i+1;ii<p;ii++)
     {
         cin>>x>>y>>s;
     }
     cout<<i<<endl;
    
     }
   // system("pause");
    return 0;
}
    



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章