您的位置:首页 > 其它

hdu 3234 Exclusive-OR

2012-07-03 13:09 375 查看
并查集

View Code

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int N=20010;
int set
,key
,n;
int find(int x)
{
if(x==set[x]) return x;
int t=find(set[x]);
key[x]^=key[set[x]];
return set[x]=t;
}
bool merge(int x,int y,int v)
{
int fx=find(x), fy=find(y);
if(fx==fy)
{
return (key[x]^key[y])==v;
}
if(fy==n) swap(fx,fy);
set[fy]=fx;
key[fy]=v^key[x]^key[y];
return true;
}
void query()
{
int k;
int p[20],fp[20];
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d",&p[i]);
fp[i]=find(p[i]);
}
sort(fp,fp+k);
bool flag=false;
if(fp[k-1]!=n && k%2==1) flag=true;
for(int i=1;i<k;i++)
if(fp[i]!=fp[i-1] && i%2==1) flag=true;
if(flag) printf("I don't know.\n");
else
{
int ans=0;
for(int i=0;i<k;i++) ans^=key[p[i]];
printf("%d\n",ans);
}
}
int main()
{
int Q,C=0;
while((scanf("%d%d",&n,&Q)==2) && (n||Q))
{
printf("Case %d:\n",++C);
for(int i=0;i<=n;i++) set[i]=i;
memset(key,0,sizeof(key));
bool flag=false;
int cnt=0;
while(Q--)
{
char op[2];
scanf("%s",op);
if(op[0]=='I')
{
cnt++;
int p,q,v;
char str[30];
gets(str);
if(sscanf(str,"%d%d%d",&p,&q,&v)==2)
{
v=q; q=p; p=n;
}
if(flag) continue;
if(!merge(p,q,v))
{
printf("The first %d facts are conflicting.\n",cnt);
flag=true;
}
}
else
{
if(flag)
{
int k,t;
scanf("%d",&k);
while(k--) scanf("%d",&t);
}
else query();
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: