hdu 3234 Exclusive-OR
2012-07-03 13:09
375 查看
并查集
View Code
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; }
相关文章推荐
- hdu 3234 Exclusive-OR
- HDU 3234 Exclusive-OR(加权并差集)
- HDU 3234 Exclusive-OR 扩展并查集
- HDU 3234 Exclusive-OR Regional的题就是硬啊卧槽
- hdu 3234 Exclusive-OR 有权并查集
- HDU 3234 Exclusive-OR 扩展并查集
- HDU 3234 Exclusive-OR
- HDU 3234 Exclusive-OR
- Hdu 3234 & Uva 12232 Exclusive-OR
- HDU 3234 Exclusive-OR 并查集
- HDU 3234 Exclusive-OR 并查集变形
- hdu 3234 Exclusive-OR (并查集)
- HDU 3234 - Exclusive-OR(并查集)
- HDU 3234 Exclusive-OR 09年武汉区域赛E题
- HDU 3234 Exclusive-OR(并查集偏移向量)
- HDU 3234 | UValive 4487 - Exclusive-OR (加权并查集)
- [HDU 3234] Exclusive-OR
- hdu 3234 Exclusive-OR[并查集] 施工中没写完233
- HDU 3234 Exclusive-OR(并查集)
- HDU 3234 Exclusive-OR 并查集扩展