HDU 3234 Exclusive-OR
2013-12-20 15:40
330 查看
异或并查集
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <fstream> #include <string> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <algorithm> #include <functional> #define eps 1e-8 #define pi acos(-1.0) #define inf 0x3f3f3f3f #define INF 0x3f3f3f3f3f3f3f3fLL #define _clr(x,a) memset(x,a,sizeof(x)) #define min(a,b)) (a)<(b)?(a):(b) #define max(a,b) (a)>(b)?(a):(b) #define rep(i,n) for(int i=1;i<=n;++i) using namespace std; //#define sponge_wxy_code const int maxn = 20010; int parent[maxn], val[maxn]; int n, q; int K, num[20]; char str[1010]; void init_set() { for(int i = 0; i <= n; ++i) { parent[i] = i; val[i] = 0; } return ; } int find_set(int u) { if(parent[u] != u) { int temp = parent[u]; parent[u] = find_set(parent[u]); val[u] ^= val[temp]; //val[u] ^= val[temp]; } return parent[u]; } void union_set(int r1, int r2, int u, int v, int c) { if(r1 == n) swap(r1, r2); val[r1] = (val[u]^val[v]^c); parent[r1] = r2; return ; } int query() { bool visit[20]; int ans = 0; memset(visit, false, sizeof(visit)); for(int i = 0; i < K; ++i) { if(visit[i]) continue; int root = find_set(num[i]), cnt = 0; for(int j = i; j < K; ++j) { if(!visit[j] && (root == find_set(num[j]))) { visit[j] = true; cnt++; ans ^= val[num[j]]; } } if((cnt&1) && root != n) return -1; } return ans; } int main() { #ifdef sponge_wxy_code freopen("aa.in", "r", stdin); freopen("bb.out", "w", stdout); #endif int kcase = 0; while(scanf("%d %d", &n, &q)) { if(n == 0 && q == 0) break; printf("Case %d:\n", ++kcase); init_set(); bool flag = false; int cas = 0; while(q--) { scanf("%s", str); if(str[0] == 'I') { getchar(); gets(str); cas++; int space = 0, u, v, w; for(int i = 0; i < (int)strlen(str); ++i) space = space + (str[i] == ' '); if(space == 1) { sscanf(str, "%d %d", &u, &w); v = n; } else { sscanf(str, "%d %d %d", &u, &v, &w); } if(flag) continue; int r1 = find_set(u), r2 = find_set(v); if(r1 == r2 && (val[u]^val[v]) != w) { flag = true; printf("The first %d facts are conflicting.\n", cas); } else { union_set(r1, r2, u, v, w); } } else { scanf("%d", &K); for(int i = 0; i < K; ++i) scanf("%d", &num[i]); if(flag) continue; int ans = query(); if(ans == -1) { printf("I don't know.\n"); } else { printf("%d\n", ans); } } } printf("\n"); } return 0; }
相关文章推荐
- 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(并查集)
- 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 & Uva 12232 Exclusive-OR
- HDU 3234 Exclusive-OR 并查集