题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的。这些小朋友中有一个是裁判,他可以随便出手势。现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判。

思路:枚举每个小朋友,删除与这个小朋友有关的边,利用并查集判断是否有冲突,如果有冲突说明这个小朋友不能成为裁判,因为不可能有两个裁判。记录可能的裁判的数量,以及对应每个小朋友最早冲突的时间。

如果裁判的数量为1,很明显这个小朋友就是裁判,那么如何求得最早判定的时间?利用排除法,如果能够尽快的排除其他n-1个小朋友成为裁判的机会,那么答案就是max(err[i]),err[i]就是每个小朋友冲突的最早时间。

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 500 + 5;
struct node{
	int par;
	int real;
}a[maxn];

struct Edge{
	int u, v, k;
}b[maxn<<2];

void init(int n) {
	for(int i = 0; i < n; ++i) {
		a[i].par = i;
		a[i].real = 0;
	}
}

int find(int x) {
	if(a[x].par == x) return x;
	int par = find(a[x].par);
	a[x].real = (a[x].real + a[a[x].par].real) % 3;
	return a[x].par = par;
}

bool unionset(int x, int y, int r) {
	int rx = find(x), ry = find(y);
	if(rx == ry) {
		int rr = (3 - a[y].real + a[x].real) % 3;
		if(rr != r) return false;
	}
	else { //合并
		a[rx].par = y;
		a[rx].real = (3 - a[x].real + r) % 3;
	}
	return true;
}
int main() {
	int n, m;
	while(scanf("%d%d", &n, &m) == 2) {
		getchar();
		char ch;
		for(int i = 0; i < m; ++i) {
			scanf("%d", &b[i].u);
			while(ch = getchar()) {
				if(ch == '=' || ch == '>' || ch == '<') {
					if(ch == '=') b[i].k = 0;
					else if(ch == '>') b[i].k = 1;
					else b[i].k = 2;
					break;
				}
			}
			scanf("%d", &b[i].v);
			//printf("%d %d %d\n", b[i].u, b[i].k, b[i].v);
		}
		int err = 0, flag, cnt = 0, judge;
		for(int i = 0; i < n; ++i) { //枚举裁判
			init(n);
			int flag = 1;
			for(int j = 0; j < m; ++j) {
				int u = b[j].u, v = b[j].v;
				if(u == i || v == i) continue;
				if(!unionset(u, v, b[j].k)) {
					err = max(err, j+1);
					flag = 0;
					break;
				}
			}
			if(flag) {
				++cnt;
				judge = i;
			}
		}
		if(cnt == 0) printf("Impossible\n");
		else if(cnt >= 2) printf("Can not determine\n");
		else printf("Player %d can be determined to be the judge after %d lines\n", judge, err);
	}
	return 0;
} 

如有不当之处欢迎指出!

POJ - 2912 Rochambeau 种类并查集的更多相关文章

  1. POJ2912 Rochambeau —— 种类并查集 + 枚举

    题目链接:http://poj.org/problem?id=2912 Rochambeau Time Limit: 5000MS   Memory Limit: 65536K Total Submi ...

  2. POJ 1182 食物链(种类并查集)

    记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误. 在A了十几道并查集后,再做这道题,发现太小儿科了.发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对 ...

  3. A Bug’s Life POJ - 2492(种类并查集)

    题目链接 每次给出两个昆虫的关系(异性关系),然后发现这些条件中是否有悖论 就比如说第一组数据 1 2 2 3 1 3 1和2是异性,2和3是异性,然后说1和3是异性就显然不对了. 我们同样可以思考一 ...

  4. 食物链 POJ 1182(种类并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  5. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  6. POJ 1733 Parity game(种类并查集)

    http://poj.org/problem?id=1733 题意: 给出一个01串,有多次询问,每次回答[l,r]这个区间内1的个数的奇偶性,但是其中有一些回答是错误的,问到第几个回答时与前面的回答 ...

  7. Poj(1182),种类并查集

    题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...

  8. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  9. 种类并查集,Poj(1703)

    题目链接:http://poj.org/problem?id=1703 第一次做种类并查集,有的地方还不是很清楚,想了一上午,有点明白了,这里记录一下. 这里我参考的红黑联盟的题解. 关键:种类并查集 ...

随机推荐

  1. linux常用命令_1

    linux中命令格式是什么? 命令 [参数选项] [文件或路径] 中括号表示可选,命令的参数与路径文件可选 参数选择表示一个命令的不同功能 命令 和 参数选项 中必有一空格,多个参数连在一起写 几乎所 ...

  2. scrapy_Response and Request

    scrapy中重要的两个类是什么? Requests.Response 什么是Requests? 网页下载 有哪些参数? url callback headers     # 头部信息 cookie ...

  3. 腾讯工程师带你深入解析 MySQL binlog

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯云数据库内核团队 发布在云+社区 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的red ...

  4. 微信小程序实战:天气预报

    接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...

  5. [Qt Quick] qmlscene工具的使用

    qmlscene是Qt 5提供的一个查看qml文件效果的工具.特点是不需要编译应用程序. qmlscene = qml + scene (场景) qmlscene.exe位于Qt的安装目录下 (类似/ ...

  6. RecyclerView用法

    主界面布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  7. Part 1:请求与响应--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  8. PHP与XML

    代码: <?php $dom= new DomDocument('1.0'); $books=$dom->appendChild($dom->createElement_x_x('b ...

  9. 【转】Shell执行MySql操作

    mysql  -hhostname -Pport -uusername -ppassword  -e  相关mysql的sql语句,不用在mysql的提示符下运行mysql,即可以在shell中操作m ...

  10. Cacti在selinux开启的情况下使用

    # chcon -R -t httpd_sys_content_t /var/www/html/cacti