UVALive - 3713 Astronauts(2-SAT)
题目大意:有A,B,C 3个任务要飞配给n个宇航员,现给出n个宇航员的年龄和每种任务的执行要求。
A任务只有年龄大于等于平均年龄的宇航员才可以执行
B任务只有年龄小于平均年龄的宇航员才可以执行
C任务任何宇航员都可以执行
现在有M对讨厌关系,互相讨厌的宇航员不能执行同一种任务,现要求找出一个满足上述所有要求的任务分配方案
解题思路:年龄大于等于平均年龄的宇航员只能执行A任务或者C任务,假设执行A任务为true
同理,年龄小于平均年龄的宇航员只能执行B任务或者C任务,假设执行B任务为true
如果两个宇航员相互讨厌,相互讨厌的情况得分两种
一种相互讨厌的宇航员是年龄都大于等于平均年龄或者年龄都小于平均年龄的,这种相互讨厌的情况下,两个宇航员只能执行不同的任务,因此要满足 一真一假的要求
另一种情况是年龄在平均年龄两侧的,这种情况的话,只要不同时执行C任务就可以了,因此要满足其中一个非假
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 200010
#define INF 0x3f3f3f3fstruct TwoSAT{int n, c;vector<int> G[N];bool mark[N];int S[N];bool dfs(int x) {if (mark[x ^ 1]) return false;if (mark[x]) return true;mark[x] = true;S[c++] = x;for (int i = 0; i < G[x].size(); i++)if (!dfs(G[x][i])) return false;return true;}void init(int n) {this->n = n;for (int i = 0; i < 2 * n; i++)G[i].clear();memset(mark, 0, sizeof(mark));}//x == xval or y == yvalvoid add_clause(int x, int xval, int y, int yval) {x = x * 2 + xval;y = y * 2 + yval;G[x^1].push_back(y);G[y^1].push_back(x);}bool solve() {for (int i = 0; i < 2 * n; i += 2) {if (!mark[i] && !mark[i + 1]) {c = 0;if (!dfs(i)) {while (c > 0) mark[S[--c]] = false;if (!dfs(i + 1)) return false;}}}return true;}
};TwoSAT solver;
int age[N], ave;
int n, m;void solve() {if (!solver.solve())printf("No solution.\n");else {for (int i = 0; i < n; i++) {if (age[i] >= ave) {printf("%c\n", solver.mark[i * 2] ? 'A': 'C');}else {printf("%c\n", solver.mark[i * 2] ? 'B': 'C');}}}
}void init() {int Sum = 0;for (int i = 0; i < n; i++) {scanf("%d", &age[i]);Sum += age[i];}ave = (Sum + n - 1) / n;solver.init(n);int u, v;for (int i = 0; i < m; i++) {scanf("%d%d", &u, &v);u--; v--;if ( (age[u] >= ave && age[v] >= ave) || (age[u] < ave && age[v] < ave)) {solver.add_clause(u, 1, v, 1);solver.add_clause(u, 0, v, 0);}else {solver.add_clause(u, 0, v, 0);}}
}int main() {while (scanf("%d%d", &n, &m) != EOF && n + m) {init();solve();}return 0;
}
UVALive - 3713 Astronauts(2-SAT)相关推荐
- 训练指南 UVALive - 3713 (2-SAT)
layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...
- uvaLive 3713
题目链接 #include <cstdio> #include <cstring> #include <vector> using namespace std; # ...
- uvalive 3713 2-sat
/** 分析:训练指南图论例题10,p327 2-sat **/#include <iostream> #include <cstdio> #include <cstri ...
- 图论算法与模型(训练指南题库)
一.基础题目 1.UVA 11624 Fire!迷宫问题 多源BFS 题意: 帮助joe走出一个大火蔓延的迷宫,其中joe每分钟可往上下左右四个方向之一走,所有着火的格子都会蔓延(空格与着火格有公共边 ...
- UVA1391 Astronauts(ACM - ICPC 2006 Europe - Central)(2 - SAT问题、输出方案)
虽然题目里有A.B.C三种状态,但是每个人只有两个状态可以选择,显然是一道2-SAT: 建图的话,假设选择A(或者B)为i+n,选择C为i:首先当两个人讨厌时,一个人选C,则另一个一定选另一个,连两条 ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...
- 模板 - 2 - SAT问题
整理的算法模板合集: ACM模板 注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了 方案输出时,c ...
- 计算机学院 图论方向,成电计算机学院本科生在计算机科学理论方向重要国际会议SAT上发表论文...
近日,计算机科学与工程学院(网络空间安全学院)2017级本科生和肖鸣宇教授撰写的论文"A Fast Algorithm for SAT in Terms of Formula Length& ...
- The UVALIVE 7716 二维区间第k小
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...
- MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 美国麻省理工学院今天在招生网站上宣布,决定不再考虑将SAT科目考试作为录取过程的一部分. 这一决定从2020~2021学年开始生效. SA ...
最新文章
- 什么场景使用mysql的存储过程_mysql存储过程的使用
- 全民自动驾驶5年内真的会来吗?这是Lyft的自动驾驶2.0
- SQL Server 2005 Service Broker 初探
- Lesson 12.1 深度学习建模实验中数据集生成函数的创建与使用
- thinkphp mysql 日志_thinkphp5 日志
- 视频领域的Instagram:Viddy用户突破2600万
- softlayer virtual machine vhd磁盘镜像导入shell脚本
- Windows平台真实时毫秒级4K H264/H265直播技术方案探讨
- 移动端与PC端页面布局区别
- vmware-安装vmware tools教程190915
- RabbitMQ 构建高可靠集群架构
- 【英语学习】【Daily English】U10 Education L01 Is this certificate a must?
- 初始化问题(其中含有盲区,{}和()的区别)
- 目录 1.1. Vue是什么??客户端mvc框架,,功能类似springmvc	1 1.2. Why?为什么使用它??	1 1.3. 包括哪些组件与内部构成与原理	1 2. Howto 怎么使用	2
- 电路基本原理的那些事儿之 分压原理
- springboot整合mybatis拦截器分页
- Eclipse修改项目编码方式
- 解决微信访问 80 端口的限制问题
- 玩转curl指令—测试简单的HTTP接口
- 850是什么意思_850w是什么意思 孤存850w是什么梗