Hdu4115 Eliminate the Conflict 【2-SAT、3 -> 2】

2024-04-22 19:36
文章标签 sat conflict eliminate hdu4115

本文主要是介绍Hdu4115 Eliminate the Conflict 【2-SAT、3 -> 2】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Eliminate the Conflict

题意

A l i c e Alice Alice B o b Bob Bob 在玩剪刀石头布,一共 n n n 轮。但 A l i c e Alice Alice 已经提前得知了 B o b Bob Bob 每一轮将要出的结果( 1 1 1 表示石头、 2 2 2 表示布、 3 3 3 表示剪刀)
为了不让 A l i c e Alice Alice 赢得太轻松, B o b Bob Bob A l i c e Alice Alice 提出了 m m m 个限制条件:

  • u , v , k u,v,k u,v,k:如果 k = 0 k=0 k=0 A l i c e Alice Alice 必须在 u , v u,v u,v 两轮中出相同的手势,
    如果 k = 1 k = 1 k=1 A l i c e Alice Alice 必须在 u , v u,v u,v 两轮中出不同的手势

A l i c e Alice Alice 能否在遵守所有限制条件的情况下,至少不输 B o b Bob Bob
(我不是想赢,我只是不想输)

思路

如果我们将三种手势的序号减一,那么可以发现三种手势的序号,能赢当前的手势 i i i 的序号正好是 ( i + 1 ) m o d 3 (i + 1) mod 3 (i+1)mod3,那么我们在提前知道 b i b_i bi B o b Bob Bob 每轮要出的手势)的前提下,我们这一轮只能出 i i i ( i + 1 ) m o d 3 (i + 1) mod 3 (i+1)mod3,这样子才能保证不输,这样子就将 3 − S A T → 2 − S A T 3-SAT \rarr 2-SAT 3SAT2SAT

再来考虑限制,对于相同和不同的情况,分情况讨论一下,要连的边右点多

// Problem: Eliminate the Conflict
// Contest: HDOJ
// URL: https://acm.hdu.edu.cn/showproblem.php?pid=4115
// Memory Limit: 32 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n' 
#define ull unsigned long longconst int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;typedef long long ll;struct TwoSat {int n; //属性数量std::vector<std::vector<int>> e;std::vector<bool> ans;TwoSat(int n) : n(n), e(2 * n), ans(n) {} //下标从0开始/* 建边表示 u为f 且 v为g */void addedge(int u, bool f, int v, bool g) { //原变量和反变量相邻放e[2 * u + !f].push_back(2 * v + g); //反变量在偶数位置,原变量在奇数位置e[2 * v + !g].push_back(2 * u + f);}void adde(int u, int f, int v, int g){e[2 * u + f].push_back(2 * v + g);}bool satisfiable() {std::vector<int> id(2 * n, -1), dfn(2 * n, -1), low(2 * n, -1);std::vector<int> stk;int now = 0, cnt = 0;std::function<void(int)> tarjan = [&](int u) {stk.push_back(u);dfn[u] = low[u] = now++;for (auto v : e[u]) {if (dfn[v] == -1) {tarjan(v);low[u] = std::min(low[u], low[v]);} else if (id[v] == -1) {low[u] = std::min(low[u], dfn[v]);}}if (dfn[u] == low[u]) {int v;do {v = stk.back();stk.pop_back();id[v] = cnt;} while (v != u);++cnt;}};for (int i = 0; i < 2 * n; ++i) if (dfn[i] == -1) tarjan(i);for (int i = 0; i < n; ++i) {if (id[2 * i] == id[2 * i + 1]) return false;ans[i] = id[2 * i] > id[2 * i + 1]; //取依赖性更高的那个}return true;}std::vector<bool> get_ans() { return ans; }
};int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int _;std::cin >>_;fore(test, 1, _ + 1){std::cout << "Case #" << test << ": ";int n, m;std::cin >> n >> m;TwoSat ts(n);std::vector<int> b(n);std::vector<std::pair<int, int>> c(n); //在这一轮能出的两种手势fore(i, 0, n){std::cin >> b[i];--b[i];c[i] = {(b[i] + 1) % 3, b[i]};}while(m--){int u, v, k;std::cin >> u >> v >> k;--u;--v;if(!k){ //sameif(c[u] == c[v]){ts.addedge(u, 1, v, 0);ts.addedge(u, 0, v, 1);}else{if(c[u].fi == c[v].fi){ts.adde(u, 1, u, 0);ts.adde(v, 1, v, 0);ts.adde(u, 0, v, 0);ts.adde(v, 0, u, 0);}else if(c[u].se == c[v].se){ts.adde(u, 0, u, 1);ts.adde(v, 0, v, 1);ts.adde(u, 1, v, 1);ts.adde(v, 1, u, 1);}else if(c[u].fi == c[v].se){ts.adde(u, 1, u, 0);ts.adde(v, 0, v, 1);ts.adde(u, 0, v, 1);ts.adde(v, 1, u, 0);}else{ts.adde(u, 0, u, 1);ts.adde(v, 1, v, 0);ts.adde(u, 1, v, 0);ts.adde(v, 0, u, 1);}}}else{ //differentif(c[u] == c[v]){ts.addedge(u, 0, v, 0);ts.addedge(u, 1, v, 1);}else{if(c[u].fi == c[v].fi){ts.addedge(u, 1, v, 1);}else if(c[u].se == c[v].se){ts.addedge(u, 0, v, 0);}else if(c[u].fi == c[v].se){ts.addedge(u, 1, v, 0);}else{ts.addedge(u, 0, v, 1);}}}}if(ts.satisfiable())	std::cout << "yes\n";else std::cout << "no\n";}return 0; 
}

这篇关于Hdu4115 Eliminate the Conflict 【2-SAT、3 -> 2】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926674

相关文章

新SAT官方范文得分的分段分析

· 本次官方给出了两道写作新样题,样题的材料文章分别是节选自Paul Bogard于2012.12.21发表在《洛杉矶时报》的“Let There Be Dark.”及Dana Gioia于2005.04.10发表在《纽约时报》的“Why Literature Matters” 。   · 张卉老师结合之前的新SAT改革的说明,认为写作部分的基本出题思路没有大的调整,样题的材料文章都是节选自

SAT改革:SAT官方最新样题解读与备考建议

College Board于2015年1月9日释放新SAT考试最新样题,小编第一时间为各位考生及家长进行新SAT考试的样题解析及备考规划建议,此次小编给出了SAT语法样题一、样题二,阅读第一、二篇,数学,写作样题与范文的详细解读,希望各位考生在2015冲刺高分成绩! 新SAT科目官方样题答案解析新SAT语法新SAT写作与语法能力真题及答案样题1解析 | 样题2解析 | 新SAT语法备考建议新

SAT阅读考试的典型问题及应对策略

SAT阅读部分的测试时间为70分钟,共65道选择题,每道选择题有五项选择,其中只有一项选择为正确答案。结合所阅读的文章,每道选择题以提出问题的形式出现,通常被问到的问题类型为:本篇文章的主要观点及中心主题;在本篇文章中,作者对所论述问题的态度及基本观点;判断所阅读文章的体裁形式,例如:议论、寓言、科技、历史、讽刺、悲剧、喜剧、浪漫、科幻、恐怖、写实及诗歌;作者在文章中所用的修辞手法的目的,在这

如何克服SAT考试阅读难关?

对中国考生而言,SAT阅读部分的考题为最难。SAT阅读由两部分组成,即阅读判断及句子填空,全部为选择题型。SAT阅读的考试时间为70分钟,65道题,每答对一道题得12.3分,总共800分。国内考生若想在SAT阅读中取得理想的成绩,至少要具备两项基本能力,其一,要掌握一万左右的英语词汇量;其二,要有能力根据上下文的关系,准确识别不认识的英语词汇。SAT阅读部分题量大、时间紧,考生要在不超过一分钟

四步走循序渐进克服SAT阅读关

五月份的SAT考试刚刚结束,阅读自然是各个部分中最有难度的,也是最令同学们望而生畏的。但相较于几个月前,同学们纷纷表示,在经过了系统而全面的训练和练习之后,还是可以打倒阅读这一SAT高分路上拦路虎的。 事实上,只要过了四个关卡,同学们就可彻底解决SAT阅读。   第一关:单词关   要读懂一篇文章,无疑最基本的一点是要认识这篇文章的字。如果入目皆是生词,一定会有一种“满纸荒唐言”的感觉――

考生备考分享:SAT阅读提分技巧

不少同学认为阅读是SAT考试中最难的部分,很多人抱怨时间太紧做不完题,也有很多人说做完题了但是正确率很低。在经历了第一次SAT后,我总结了一些的阅读经验,凭借运用这些经验,我的第二次SAT阅读成绩有了非常大的进步。现在将这些经验分享给大家。   1、在做阅读题时,首先应该把文章通读一遍,但这种通读并不是漫无目的的浏览,而是要筛选着读。   在这一遍里,要注意发掘、总结作者的核心思想是什么,

如何跨越SAT阅读词汇的障碍

SAT 阅读词汇对考生的要求一般是在数量上要越多越好,但是对于一些比较常见的词汇,大家还是需要掌握一个记忆原则,就是要精确掌握词汇的含义,这样才能在SAT阅读题目中做到有备无患,不被词汇拦住解题的道路。   由于很多同学把精力和时间都放在快速增加词汇量上,很多考生在记忆SAT阅读词汇的时候都会犯浅尝辄止,不求甚解的毛病,认为只要知道个大概意思,在阅读文章中根据上下文就可以猜到含义了,以至于对

二战SAT阅读成功经验分享:掌握时间规律

不少同学认为阅读是SAT中最难的部分,很多人抱怨时间太紧做不完题,也有很多人说做完题了但是正确率很低。在经历了第一次SAT后,我总结了一些的阅读经验,凭借运用这些经验,我的第二次SAT阅读成绩有了非常大的进步。现在将这些经验分享给大家。   1、在做阅读题时,首先应该把文章通读一遍,但这种通读并不是漫无目的的浏览,而是要筛选着读。   在这一遍里,要注意发掘、总结作者的核心思想是什么,文章

考生经验谈:如何做好SAT阅读的时间掌控

许多同学认为SAT阅读是SAT考试中最难的一个部分,大部分同学都表示问题出在时间上,很多人觉得时间太紧没法做完题,有些人表示即使做完题了正确率也很低。那么该如何合理安排SAT阅读的时间呢,根据我两次参加SAT考试的经验,我总结出了下面三点SAT阅读时间的规律,现与大家分享。   1、在做阅读题时,首先应该把文章通读一遍,但这种通读并不是漫无目的的浏览,而是要筛选着读。   在这一遍里,要注

SAT阅读高分技巧:带着问题通读全文

在这一遍里,要注意发掘、总结作者的核心思想是什么,文章的结构是怎样的,每个部分是什么意思。该详读的地方:首段,末段,每段开头和结尾,转折句,结论句。在这些地方可以用笔画出来或者在旁边做标记,这样利于答题。可以略读的地方:例子、形容词、副词等。不要纠结于一些陌生的单词而止步不前,因为这些单词不一定是重点内容,也可能在下文中可以推测出该词的意思。再次,对文章开始三分之一左右的内容要读得仔细一些,因