La3713 Astronauts 2-Sat
题目大意:
有A, B, C三个任务分配给n个宇航员, 其中每个宇航员要被分配一个任务。所有年龄大于平均年龄的宇航员可以选择A, C两种任务,其余人只能选择B, C两种任务, 同时这n个宇航员中有m组矛盾, i 和 j 之间矛盾表示 i 与 j 不能参与同一项任务。
问每个宇航员应如何分配任务。
分析:
本题是一个典型的2-Sat类型的题目,宇航员之间的矛盾有两种情况, 分别表示两个宇航员属于同一类型和不属于同一类型时候的选择,我们用真来表示选择A或B, 假来表示选择C, 那么当 i 和 j 两个宇航员属于同类时, 就说明 i 为真时 j 必定为假, 反之亦然。否则,只需要两者不同为假即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;struct Twosat {int n;vector<int> G[maxn*2];bool mark[maxn*2];int S[maxn*2], c;void init(int n) {this->n = n;memset(mark, 0, sizeof(mark));for(int i=0; i<2*n; i++) G[i].clear();}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;}//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); // when x != xval , y must = yval;G[y^1].push_back(x); // when y != yval , x must = xval;}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;}
}solver;int n, m, u, v;
bool type[maxn];
int age[maxn], age_sum;void init() {solver.init(n);age_sum = 0;memset(type, false, sizeof(type));
}
int main() {
#ifndef ONLINE_JUDGEfreopen("data.txt", "r", stdin);freopen("ans.txt", "w", stdout);
#endifwhile(scanf("%d%d", &n, &m) == 2 && n+m) {init();for(int i=0; i<n; i++) {scanf("%d", &age[i]);age_sum += age[i];}for(int i=0; i<n; i++) type[i] = (age[i] * n >= age_sum);for(int i=0; i<m; i++) {scanf("%d%d", &u, &v); u--, v--;if(type[u] == type[v]) solver.add_clause(u, 1, v, 1), solver.add_clause(u, 0, v, 0);else solver.add_clause(u, 1, v, 1);}if(!solver.solve()) printf("No solution.\n");else {for(int i=0; i<n; i++) {if(solver.mark[i*2+1]) printf("%c\n", type[i] ? 'A' : 'B');else printf("%c\n", 'C');}}}return 0;
}
La3713 Astronauts 2-Sat相关推荐
- UVA1391 Astronauts(ACM - ICPC 2006 Europe - Central)(2 - SAT问题、输出方案)
虽然题目里有A.B.C三种状态,但是每个人只有两个状态可以选择,显然是一道2-SAT: 建图的话,假设选择A(或者B)为i+n,选择C为i:首先当两个人讨厌时,一个人选C,则另一个一定选另一个,连两条 ...
- 模板 - 2 - SAT问题
整理的算法模板合集: ACM模板 注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了 方案输出时,c ...
- 计算机学院 图论方向,成电计算机学院本科生在计算机科学理论方向重要国际会议SAT上发表论文...
近日,计算机科学与工程学院(网络空间安全学院)2017级本科生和肖鸣宇教授撰写的论文"A Fast Algorithm for SAT in Terms of Formula Length& ...
- MIT录取不再看SAT科目成绩:曾是华裔传统优势,数学等学科测验更是中国留学生强项...
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 美国麻省理工学院今天在招生网站上宣布,决定不再考虑将SAT科目考试作为录取过程的一部分. 这一决定从2020~2021学年开始生效. SA ...
- 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
加州大学欧文分校对于SAT成绩的要求是多少?现在申请美国本科,很多都是需要同学们提供sat成绩的额,下面托普仕留学老师为大家介绍SAT多少分才能申请加州大学欧文分校?同学们在申请之前要多注意院校信息. ...
- 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求
下面为大家介绍的是加州大学欧文分校University of California Irvine的SAT成绩要求.加州大学欧文分校University of California Irvine是美国加 ...
- 如何使用SAP事务码SAT进行UI应用的性能分析
Sent: Wednesday, July 11, 2012 7:49 PM Subject: [Knowledge share]How to trace UI transaction using S ...
- 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
今天是农历鼠年大年初四,本文是鼠年第4篇文章,也是汪子熙公众号第203篇原创文章. 大家这几天在家里宅得如何了?貌似不少朋友都闷坏了. 我们继续学习. Jerry之前的文章 SAP错误消息调试之七种武 ...
- 使用ABAP SAT工具分析SAP OData service实现明细
Created by Wang, Jerry, last modified on Mar 26, 2015 使用SAT运行OData service测试report: 直接运行report: 确保OD ...
- 使用SAT研究IBASE hierarchy读取性能
Created by Jerry Wang on Mar 06, 2014 1. transaction code SAT,创建一个新的variant例如ZJERRY, 确保Aggregation为N ...
最新文章
- 127 - Accordian Patience
- (翻译)Real-UID,Effective-UID,Saved-UID区别
- 自学python需要买书吗-我的孩子需要学习Python吗?几岁开始学?有什么书籍推荐?...
- qsort()的用法
- 16、React Native实战之TextInput组件
- AcWing479.加分二叉树(区间DP)题解
- win10 初试tracert
- 搞定HTML\CSS之background属性
- UER-py快速上手
- 手机电商营销模式探讨
- spring boot新闻管理系统 毕业设计源码211113
- c++ value categories
- 如何提高团队管理能力3
- Latex, overleaf 输入中文 可行方法
- Mysql table_definition_cache
- 三大设计模式详细总结
- Windows内核安全与驱动开发
- 使用 github pages, 部署静态网页
- gmp计算机软件系统分类原则,新版GMP对自动化设备、计算机系统软件的验证要求...
- 破解linux root密码(方式 重置root密码)