【题解】JSOI2010满汉全席
第一次接触2-SAT——SAT,即适定性(Satisfiability)的缩写。像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP完全问题。所以现在常见的考法便是2-SAT。
这一道题目算是一道裸的2-SAT问题。每一个人有两种需求,那么我们就将每一种食物拆成两个点,一个代表m,一个代表h,可以注意到满足所有人的需求即如果满足不了其中一个,必须满足另一个,所以我们建图的方法为从无法满足要求的点连向必须满足的点,代表若一个点不符合要求,必然走向后续的决策。那么问题的答案相比到这里已经比较明了了。我们就应当在这张图上求出强连通分量,看是否有一个点的两个拆点都存在于同一个强连通分量上。若是如此,就说明无法满足要求。
#include <bits/stdc++.h>
using namespace std;
#define maxn 100000
int T, cnt, cnp = , n, m, low[maxn], dfn[maxn], num[maxn], timer, head[maxn];
bool flag, mark[maxn], vis[maxn];
stack <int> st;
struct edge
{
int to, last;
}E[maxn]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} void add(int u, int v)
{
E[cnp].to = v, E[cnp].last = head[u], head[u] = cnp ++;
} void tarjan(int u)
{
dfn[u] = low[u] = ++ timer;
vis[u] = true, mark[u] = true;
st.push(u);
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(vis[v])
{ if(mark[v] && low[u] > dfn[v]) low[u] = dfn[v]; }
else
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
}
if(dfn[u] == low[u])
{
++ cnt;
int j;
do
{
j = st.top();
st.pop();
mark[j] = false;
num[j] = cnt;
}while(!st.empty() && j != u);
}
} void init()
{
memset(vis, , sizeof(vis));
memset(head, , sizeof(head));
cnp = , timer = ;
flag = false;
} int main()
{
T = read();
while(T --)
{
n = read(), m = read();
init();
for(int i = ; i <= m; i ++)
{
char c1, c2;
int d1, d2;
cin >> c1 >> d1 >> c2 >> d2;
int a = , b = ;
a += (c1 == 'h'), b += (c2 == 'h');
add((( * d2) + b) ^ , ( * d1) + a);
add((( * d1) + a) ^ , * d2 + b);
}
for(int i = ; i <= * n + ; i ++)
if(!vis[i]) tarjan(i);
for(int i = ; i <= * n; i += )
if(num[i] == num[i ^ ])
{
printf("BAD\n");
flag = true; break;
}
if(!flag) printf("GOOD\n");
}
return ;
}
【题解】JSOI2010满汉全席的更多相关文章
- 【BZOJ1823】[JSOI2010]满汉全席(2-sat)
[BZOJ1823][JSOI2010]满汉全席(2-sat) 题面 BZOJ 洛谷 题解 很明显的\(2-sat\)模板题,还不需要输出方案. 对于任意两组限制之间,检查有无同一种石材要用两种不同的 ...
- 【BZOJ1823】[JSOI2010]满汉全席 2-SAT
[BZOJ1823][JSOI2010]满汉全席 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只 ...
- bzoj1823 [JSOI2010]满汉全席(2-SAT)
1823: [JSOI2010]满汉全席 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1246 Solved: 598[Submit][Status ...
- BZOJ 1823: [JSOI2010]满汉全席( 2-sat )
2-sat...假如一个评委喜好的2样中..其中一样没做, 那另一样就一定要做, 这样去建图..然后跑tarjan. 时间复杂度O((n+m)*K) ------------------------- ...
- BZOJ_1823_[JSOI2010]满汉全席_2-sat+tarjan
BZOJ_1823_[JSOI2010]满汉全席_2-sat 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1823 分析:一道比较容易看出来的 ...
- 洛谷 P4171 [JSOI2010]满汉全席 解题报告
P4171 [JSOI2010]满汉全席 题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高 ...
- 题解 JSOI2010 找零钱的洁癖
题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...
- BZOJ1823:[JSOI2010]满汉全席——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1823 https://www.luogu.org/problemnew/show/P4171 题面 ...
- 题解 P4171 【[JSOI2010]满汉全席】
什么,tarjan?那是什么? 码量太大,我选择放弃 为什么不用dfs写2-sat呢?他会伤心的说 这题2-sat的过程大佬们已经讲得非常清楚了,我就略微提一下,主要讲dfs的原理 2_sat原理 我 ...
随机推荐
- Hive初识(二)
Hive分区 Hive组织表到分区.它是将一个表到基于分区列,如日期,城市和部门的值相关方式.使用分区,很容易对数据进行部分查询. 表或分区是细分成桶,以提供额外的结构,可以使用更高效的查询的数据.桶 ...
- python-集合类型
集合具有唯一性(集合中的元素各不相同),无序性,确定性(集合中的元素是不可改变的,不能是列表,字典以及集合本身) 1.add(self, *args, **kwargs),union(self, *a ...
- mybatis报表,动态列与查询参数+行列转换
这是报表原型,在这张报表中,使用了动态的列与动态查询参数,动态列与动态查询参数全部使用map将参数传入 map参数: //拼接查询时间 for (String month : monthList) { ...
- (数据科学学习手札20)主成分分析原理推导&Python自编函数实现
主成分分析(principal component analysis,简称PCA)是一种经典且简单的机器学习算法,其主要目的是用较少的变量去解释原来资料中的大部分变异,期望能将现有的众多相关性很高的变 ...
- spoj1026 favorite dice
#include <bits/stdc++.h> using namespace std; int n,t; ; double dp[N]; /* 甩一个n面的骰子,问每一面都被甩到的需要 ...
- ABAP CDS ON HANA-(11)ABAP CDSでの関連付け
Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...
- MapRudecer
MapReducer基本概念 Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认 ...
- 洛谷P1090 合并果子
合并果子 题目链接 这个只能用于结构体中 struct item { int val; friend bool operator < (item a,item b) { return a.val ...
- 使用TFS需要注意的地方
1. 用管理员添加了本地映射,然后用其他用户就添加不了映射,一定要先用管理员账户去把映射 删除掉: 2. 在正式使用TFS时,一定需要在VS工具的设置里面,设置一下,签出时自动获取最新的代码.(默认是 ...
- Android学习笔记之,调用系统图库,添加自定义字体,屏幕截图
新年开始的第一天就来学习了慕课迎春活动中的Android心愿分享一课,学到了几个知识点,在此记录一下. 1.调用系统图库调用系统图库用的是intent,步骤为弹出系统图库选择器,选择图片后获取到所选择 ...