UVA 12232 - Exclusive-OR(带权并查集)
UVA 12232 - Exclusive-OR
题意:有n个数字。一開始值都不知道,每次给定一个操作,I a v表示确认a值为v,I a b v,表示确认a^b = v,Q k a1 a2 a3 ... ak。表示推断这些数字的异或值是否能确定。能确定就输出值,假设有矛盾就停止
思路:带权并查集,权表示和父结点的异或值,那么多数推断的时候,仅仅要全部数字和他的父结点的异或值的异或值。假设父结点的个数是偶数个。那么依据异或的性质能抵消掉,是能够判定的。假设不为偶数,就是不能判定。
注意第一种操作,要加个小处理,就是多一个虚拟结点,保证虚拟结点始终为根。虚拟结点代表0。这样仅仅要连到虚拟结点上。第一种和另外一种操作事实上就是一样的了
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 20005; int n, qn, parent[N], val[N], vis[N];
struct query {
char c;
int a, b, v, k, x[20];
} q[2 * N]; int find(int x) {
if (x == parent[x]) return x;
int tmp = parent[x];
parent[x] = find(parent[x]);
val[x] ^= val[tmp];
return parent[x];
} void init() {
for (int i = 0; i <= n; i++) {
parent[i] = i;
val[i] = 0;
}
char Q[105];
for (int i = 0; i < qn; i++) {
scanf("%s", Q);
q[i].c = Q[0];
int a, b, v;
if (Q[0] == 'I') {
gets(Q);
if (sscanf(Q, "%d%d%d", &a, &b, &v) == 2) {
v = b; b = n;
}
q[i].a = a; q[i].b = b; q[i].v = v;
}
else {
scanf("%d", &q[i].k);
for (int j = 0; j < q[i].k; j++)
scanf("%d", &q[i].x[j]);
}
}
} void solve() {
int fir = 0;
for (int i = 0; i < qn; i++) {
if (q[i].c == 'I') {
fir++;
int pa = find(q[i].a);
int pb = find(q[i].b);
if (pa == n) swap(pa, pb);
if (pa == pb) {
if ((val[q[i].a]^val[q[i].b]) != q[i].v) {
printf("The first %d facts are conflicting.\n", fir);
return;
}
}
else {
parent[pa] = pb;
val[pa] = val[q[i].a]^val[q[i].b]^q[i].v;
}
}
else {
int ans = 0;
for (int j = 0; j < q[i].k; j++) {
int px = find(q[i].x[j]);
ans ^= val[q[i].x[j]];
if (px != n)
vis[px] ^= 1;
}
int flag = 1;
for (int j = 0; j < q[i].k; j++) {
if (vis[parent[q[i].x[j]]])
flag = 0;
vis[parent[q[i].x[j]]] = 0;
}
if (flag) printf("%d\n", ans);
else printf("I don't know.\n");
}
}
} int main() {
int cas = 0;
while (~scanf("%d%d", &n, &qn) && n) {
init();
printf("Case %d:\n", ++cas);
solve();
printf("\n");
}
return 0;
}
UVA 12232 - Exclusive-OR(带权并查集)的更多相关文章
- UVA 3027 Corporative Network 带权并查集、
题意:一个企业要去收购一些公司把,使的每个企业之间互联,刚开始每个公司互相独立 给出n个公司,两种操作 E I:询问I到I它连接点最后一个公司的距离 I I J:将I公司指向J公司,也就是J公司是I公 ...
- UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)
d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
随机推荐
- 动态SQL的执行,注:exec sp_executesql 其实可以实现参数查询和输出参数的
本文转自:http://www.cnblogs.com/hnsdwhl/archive/2011/07/23/2114730.html 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态 ...
- freemarker报错之三
1.错误描写叙述 Expression students is undefined on line 30, column 24 in student.ftl. The problematic inst ...
- CREATE PROCEDURE
1 CREATE PROCEDURE(创建) CREATE PROCEDURE存储过程名(參数列表) BEGIN SQL语句代码块 END 注意: 由括号包围的參数列必须总是存在.假设没有參数,也该使 ...
- 期望dp-hdu-4336-Card Collector
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意: 有n种卡片,每包中至多有一种卡片,概率分别为p1,p2,...pn,可能有的没有卡 ...
- RMAN-使用catalog恢复目录进行备份与恢复
RMAN ArchitectureThe RMAN architecture, shown in Figure 7-3, includes a target database, repository, ...
- Func 委托 和 Action 委托 初步谈论
继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一 ...
- 装Oracle12C时遇到没有权限访问临时位置的解决方法
今天在装oracle12c是遇到了一个很奇怪的问题,显示是没有权限访问临时位置,可是我明明是用管理员的账号登陆的啊,最后在包姐的帮助下解决了,知其然,而我却不知其所以然.但还是把方法写下,希望能帮到一 ...
- MongoDB学习笔记01
MongoDB的设计理念:能从服务器端转移到驱动程序来做的事,就尽量转移. 文档是MongoDB的核心概念.多个键及其关联的值有序的放置在一起便是文档.每种编程语言表示文档的方法不太一样. 文档的键是 ...
- 使用react-native做一个简单的应用-06商品界面的实现
商品界面实现起来很简单,其实就是一个listview的使用: 关于listview的使用,在官方文档里面已经介绍的很详细了.在这里我要提一个坑. listview在Android和iOS中的效果是不一 ...
- poi HSSFRichTextString 对cell中的每一段文字设置字体
HSSFRichTextString ts= new HSSFRichTextString(" 经审核,我司已同意其出库申请.请你部按规定将托管银行承兑汇票办理出库." + &qu ...