题目链接 https://vjudge.net/problem/UVALive-3713

【题意】
有A,B,C3个任务要分给n名宇航员。其中每个宇航员要恰好分配一个任务,所有的n个宇航员平均年龄是x,只有年龄大于等于x的宇航员可以做任务A,年龄小于x的宇航员可以做任务B,任务C没有限制,有m对宇航员相互讨厌,因此不能分配到同一个任务,编程找出一个满足上述所有要求的任务分配方案,无解输出”No solution.”

【思路】
对于每个宇航员来讲只有两种选择,要么做任务A/B,要么做任务C,可以用x[i]表示第i个宇航员的分配方案,x[i]=true表示做A/B,x[i]==false表示做C。如果两个宇航员u,v互相讨厌的话,一种情况是它们同属于一种年龄类型,即u,v都是在A,C中选择或B,C中做选择,这时只能让x[u]!=x[v],等价于x[u]==0或x[v]==0,x[u]==1或x[v]==1;如果他们不是同种类型,那么只要让x[u]==1或x[v]==1即可,这样就建立了一个2-SAT模型。

#include<bits/stdc++.h>
using namespace std;const int maxn = 100050;int n, m;
vector<int> g[maxn * 2];
bool mark[maxn * 2];
int s[maxn * 2], top;void init() {for (int i = 0; i < n * 2; ++i) g[i].clear();memset(mark, 0, sizeof(mark));
}void add(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 dfs(int x) {if (mark[x ^ 1]) return false;if (mark[x]) return true;mark[x] = true;s[top++] = x;for (int i = 0; i < g[x].size(); ++i) {if (!dfs(g[x][i])) return false;}return true;
}bool solve() {for (int i = 0; i < n * 2; i += 2) {if (!mark[i] && !mark[i + 1]) {top = 0;if (!dfs(i)) {while (top > 0) mark[s[--top]] = false;if (!dfs(i + 1)) return false;}}}return true;
}int age[maxn], sum;bool issame(int u, int v) {if (n*age[u] < sum && n*age[v] < sum) return true;if (n*age[u] >= sum && n*age[v] >= sum) return true;return false;
}int main() {while (scanf("%d%d", &n, &m) == 2) {if (0 == n && 0 == m) break;sum = 0;for (int i = 0; i < n; ++i) {scanf("%d", &age[i]);sum += age[i];}init();for (int i = 0; i < m; ++i) {int u, v;scanf("%d%d", &u, &v);--u, --v;add(u, 1, v, 1);if (issame(u, v)) add(u, 0, v, 0);}if (!solve()) printf("No solution.\n");else {for (int i = 0; i < n; ++i) {if (mark[2 * i]) puts("C");else printf("%c\n", n*age[i] >= sum ? 'A' : 'B');}}}return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465433.html

Uvalive 3713 - Astronauts(2-SAT)相关推荐

  1. (2 sat) hdu 1824

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. 嵌入式系统开发:基于Linux学习笔记整理(学期汇总)

    Linux命令操作部分 Ubuntu虚拟机使用 快照 拍摄快照是为了方便还原虚拟机,因为虚拟机(Virtual Machine)是虚拟出来的出来的一台物理计算机,如果你在实验中操作不当或者其他原因导致 ...

  3. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  4. 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)

    物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...

  5. R语言用WinBUGS 软件对学术能力测验(SAT)建立层次(分层)贝叶斯模型

    R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开始).WinBUGS流程完成后,可以通过程序包本身将结果数据读 ...

  6. R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

    原文链接:http://tecdat.cn/?p=11974 R2WinBUGS软件包提供了从R调用WinBUGS的便捷功能.它自动以WinBUGS可读的格式写入数据和脚本,以进行批处理(自1.4版开 ...

  7. 布尔表达式可满足性问题(SAT)与库克-列文定理(上)

    下篇:布尔表达式可满足性问题(SAT)与库克-列文定理(下). 文章目录 一.布尔表达式可满足性问题(Boolean Satisfiability Problem, SAT) 二.形式语言与自动机 1 ...

  8. UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  9. UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  10. UVALive 6619 LIKE vs CANDLE(树形DP)

    思路: 树形dp.因为最终答案要求的是差值,所以对于每个节点我们只需要考虑差值即可,dp[u][0]表示u节点以下(含u)中like的val比candle的val大的最大值,dp[u][1]表示can ...

最新文章

  1. EnterpriseDB Migration 迁移工具使用测试(2)
  2. img引Linux的绝对路径,什么是绝对路径和相对路径
  3. 对python里的装饰器
  4. pdf文档遇到了共享冲突_如何将链接共享为PDF格式的Google文档链接
  5. 根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...
  6. windows进入mysql改user_mysql:Windows修改MySQL数据库密码(修改或忘记密码)
  7. 装饰画必备素材——装饰设计师,填充不用愁!
  8. catv系统主要有哪三部分组成_答案光接入试题(答案)3.12
  9. php日程 增删改查,使用Fullcalendar管理日程事件(增删改查拖放)
  10. PDF文件编辑并去除水印
  11. 如何在html中使用特殊字体
  12. Bandicam软件及安装教程(详细)
  13. fileman命令的帮助+?
  14. 非线性光纤光学_光学青年| 刘兆军教授与晶体光纤激光技术研究,做核心材料和器件...
  15. python并行爬虫
  16. 小红书榜单,五大行业图文笔记类
  17. ubuntu更改用户名以及密码
  18. 生成token的工具类
  19. 【新年祝福】散去2009分,祝大家新年快乐,祝所有朋友新的一年里万事如意。
  20. [宋史学习] 谁制造了“天子为点检”的木牌?

热门文章

  1. 理解与学习linux 文件系统的目录结构
  2. 5个Linux 服务器发行版你值得拥有
  3. VC6.0和VS2005:C++和C#编写调用COM组件
  4. Qt5学习笔记之QQ登录界面三:添加图片资源
  5. axios发post请求,后端接收不到参数的问题
  6. C# 从服务器下载文件
  7. luogu P2344 奶牛抗议 DP 树状数组 离散化
  8. STM32学习笔记(十) CAN通讯测试(环回模式)
  9. hlg1492盒子【最小路径覆盖】
  10. Windows Phone 8初学者开发—第18部分:在页面间导航