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

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

如果裁判的数量为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. SSM与jsp传递实体类

    jsp传controller Controller: @RequestMapping({"/user"}) public void registerUser(User uu) th ...

  2. Linkin大话Java和internet概念

    整理电脑,无意中翻到不知道哪里来的文章,觉得里面写的很好,仔细看过一遍后,整理了下贴了出来,其中的好多概念我觉得讲的很透彻. 既然Java不过另一种类型的程序设计语言,为什么还有这么多的人认为它是计算 ...

  3. 检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)

    这两个概念看了忘,碰着了又看,老是傻傻的分不清楚,今天把心得结合从网上搜的资料简单整理一下,希望帮自己明确区分开这两个概念,并牢牢的记住 1.检查型异常(Checked Exception) 个人理解 ...

  4. 【nginx】nginx解决跨域详解

    使用场景:本地运行一个项目,但是要访问外域的api接口,存在跨域问题,解决方式有很多,但我尝试用nginx解决,搜索了网上文章后再加上尝试终于成功, 其中一些注意事项和大家分享一下. 一.window ...

  5. mysql pdo数据库连接

    MYSQL $conn = @mysql_connect('localhost','root','root');//括号的里的分别代表主机.用户名.密码 mysql_select_db('test', ...

  6. 11_Python文件操作

    一.文件操作的基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  7. Optaplanner - 入门介绍

    OptaPlanner背景 在上一篇里喷了不少水,这一篇准备放点干货:其实也没办法完全干,因为很多预备知道在交待一下.好了,说一下关于OptaPlanner的背景.应用兼容性及其原理. 这一篇先说一下 ...

  8. CentOS7修改SSH远程连接端口

      CentOS7修改SSH远程连接端口              

  9. 使用scrapy爬取豆瓣上面《战狼2》影评

    这几天一直在学习scrapy框架,刚好学到了CrawlSpider和Rule的搭配使用,就想着要搞点事情练练手!!! 信息提取 算了,由于爬虫运行了好几次,太过分了,被封IP了,就不具体分析了,附上& ...

  10. 关于Apache配置虚拟主机后在局域网中让其他电脑访问

    #-----------adxssp------------# NameVirtualHost *:80 <VirtualHost *:80> ServerName www.b.com D ...