HDU 4115 Eliminate the Conflict(2-sat)

HDU 4115 Eliminate the Conflict

题目链接

题意:Alice和Bob这对狗男女在玩剪刀石头布,已知Bob每轮要出什么,然后Bob给Alice一些限制,1表示i轮和j轮Alice必须出不一样的,0表示必须出一样的,如果Alice有一局输了就算输了,否则就是赢,问Alice是否能赢

思路:2-sat问题,已经Bob出什么,Alice要么就出赢的要么就出平的,然后加上m个约束就是2-sat问题了

代码:

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int N = 10005;

int t, n, m, x[N], sn, S[N * 2];
vector<int> g[N * 2];
bool mark[N * 2];

void init() {
	for (int i = 0; i < 2 * n; i++) g[i].clear();
	memset(mark, false, sizeof(mark));
}

void add_edge(int u, int x, int v, int y) {
	u = u * 2 + x;
	v = v * 2 + y;
	g[u^1].push_back(v);
	g[v^1].push_back(u);
}

bool dfs(int u) {
	if (mark[u^1]) return false;
	if (mark[u]) return true;
	mark[u] = true;
	S[sn++] = u;
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		if (!dfs(v)) return false;
	}
	return true;
}

bool solve() {
	for (int i = 0; i < 2 * n; i += 2) {
		if (!mark[i] && !mark[i + 1]) {
			sn = 0;
			if (!dfs(i)) {
				for (int j = 0; j < sn; j++) mark[S[j]] = false;
				sn = 0;
				if (!dfs(i + 1)) return false;
			}
		}
	}
	return true;
}

int main() {
	int cas = 0;
	scanf("%d", &t);
	while (t--) {
		init();
		scanf("%d%d", &n, &m);
		int tmp;
		for (int i = 0; i < n; i++)
			scanf("%d", &x[i]);
		int u, v, w;
		while (m--) {
			scanf("%d%d%d", &u, &v, &w);
			u--; v--;
			int tmp = 6 - x[u] - x[v];
			int a = 6 - x[u] - tmp;
			int b = 6 - x[v] - tmp;
			int u1, u2, v1, v2;
			u2 = a > tmp; u1 = !u2;
			v2 = b > tmp; v1 = !v2;
			if (w == 1) {
				if (x[u] == x[v]) {
					add_edge(u, 1, v, 1);
					add_edge(u, 0, v, 0);
				} else add_edge(u, !u1, v, !v1);
			} else {
				if (x[u] == x[v]) {
					add_edge(u, 0, v, 1);
					add_edge(u, 1, u, 0);
				} else {
					add_edge(u, u1, u, u1);
					add_edge(v, v1, v, v1);
				}
			}
		}
		printf("Case #%d: %s\n", ++cas, solve() ? "yes" : "no");
	}
	return 0;
}
时间: 2024-10-30 09:50:57

HDU 4115 Eliminate the Conflict(2-sat)的相关文章

HDU 4115 Eliminate the Conflict (2011年成都赛区现场赛E题)

1.题目描述:点击打开链接 2.解题思路:本题属于2-SAT问题,第一次做这种题,还是很感兴趣的.2-SAT解决的是给定m条语句,每一条语句形如"xi为真或xj为假",问你是否可能让所有的语句都成立.那么不难发现,本题就属于一种2-SAT问题. 首先,根据题意可知,第i轮有2种出法,要么是x[i],要么是(x[i]+1)%3.我们令xi为真表示出x[i],xi为假表示出(x[i]+1)%3.对于w==1的情况,我们要分2种情况讨论:当x[u]==x[v]时,表示第u轮出x[u],那么第

HDU 4115 Eliminate the Conflict(2-sat 判解存在性)

题意: 有两个人玩一个石头剪刀布的游戏,两个人连续玩N轮,给出其中一个人的N轮出的情况和该人对另外一个人的一些限制条件,有两种限制:每种限制表示为:(a,b,c) ,如果c==0 则表示该人对另外一个人的限制为第a局和第b局出的应该一样,如果c==1表示不一样,问另外一个人是否有赢(规定每轮都不输就称赢)的可能. 思路:所以可以推出每轮必须出能平或赢的动作(两种选择)所以是2-sat.再找到约束关系即可 #include<cstdio> #include<iostream> #in

hdu 4115 Eliminate the Conflict

Description Conflicts are everywhere in the world, from the young to the elderly, from families to countries. Conflicts cause quarrels, fights or even wars. How wonderful the world will be if all conflicts can be eliminated.Edward contributes his lif

HDU 4115 Eliminate the Conflict【2-sat】

转载请注明出处:http://blog.csdn.net/u013912596 题目大意: Alice和Bob玩若干轮石头剪刀布的游戏,Alice已经知道了Bob在每一轮会出什么,但是Bob会给出一些Alice的限制条件,问Alice在不打破这些限制的情况下,有没有可能赢. 限制格式为(i,j,w),i,j代表第几轮,w=1的话,要求Alice在第i轮和第j轮的策略不能相同,w=0的话,要求Alice在第i轮和第j轮的策略必须相同. 思路: 刚开始以为这个题是个DP,按照这个想了一下,发现要求相

HDU4115.Eliminate the Conflict(剪刀石头布)——2-sat可行性判断

http://acm.hdu.edu.cn/showproblem.php?pid=4115 题目描述: Bob,和Alice两人进行n轮的剪刀石头布,已知Bob n轮的出的情况,对于Alice给出m组的限制,只要每轮Alice没输,n轮之后就算Alice赢.判断她是否能赢 分析: 对于第i轮Bob出的情况,则alice有两种选择(相当于第i个变量有两种状态),然后我们只要处理矛盾边即可 //62MS 2156K 3312 B #include<cstring> #include<cst

hdu 4115 石头剪子布(2-sat问题)

/* 题意:石头剪子布,现在已知n回合bob将会出什么,对alice有限制,对于u,v,w:如果w=0说明a,b回合必须出的一样 否则,必须不一样.alice如果输一回合就输了,否则就赢了 解: 2-sat alice有两个选择要么平手要么赢. 对于第u回合,alice可以出au,bu: 对于第v回合,alice可以出av,bv: 当w=0那么第u回合和第v回合必须相同 比较au和bu.bv是否矛盾,如果矛盾建两条边 比较av和bu.bv是否矛盾,如果矛盾建两条边 当w=1第u回合和第v回合必须

Eliminate the Conflict HDU - 4115

Conflicts are everywhere in the world, from the young to the elderly, from families to countries. Conflicts cause quarrels, fights or even wars. How wonderful the world will be if all conflicts can be eliminated. Edward contributes his lifetime to in

hdu 3715 hdu 1816 hdu 4115 (2-sat)

三个2-sat问题,我总结一下自己的经验,我还是太菜,好久没做2-sat,又不太会建图了 总结:2-sat问题的核心就是建模 建模的思想很重要: 1.首先要怎么才能看出来是2-sat问题,对于每一个点,都有两种选择,则可以考虑是2-sat 比如让你在n组里面选n个,每组2个东西,这样就是2-sat的模型 2.确定是2-sat问题之后,就是要确定,拥有两种选择的对象,比如下面的例题里,有的是x[i]的取值有0或者1两种,有的是一串钥匙有两个,但你只能选择其中一个,则对于一个钥匙,它的取值有取或者不

hdu 1811 Rank of Tetris (拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4931 Accepted Submission(s): 1359 Problem Description自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他