uva1391 2-SAT 问题
题意在大白书上。
有3 种工作 abc 大于等于平均年龄的可以去做a c 工作, 小于平均年龄的可以去做 bc , 同样转化为2 -sat 去做, 因为对于每个人也只有2 种情况可以作为选择
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=+;
struct TwoSAT{
int n;
vector<int > G[maxn*];
bool mark[maxn*];
int S[maxn*],c;
bool dfs(int x){
if(mark[x^]) return false;
if(mark[x]) return true;
mark[x]=true;
S[c++]=x;
for(int i=; i<G[x].size(); i++)
if(!dfs(G[x][i])) return false;
return true;
}
void inti(int n){
this->n =n;
for(int i=; i<*n; ++i)
G[i].clear();
memset(mark,,sizeof(mark));
}
void add_clause(int x, int xval, int y, int yval){
x = x * + xval;
y = y * + yval;
G[x^].push_back(y);
G[y^].push_back(x);
}
bool solve(){
for(int i=; i<n*; i+= )
if(!mark[i] && !mark[i+]){
c=;
if(!dfs(i)){
while(c>) mark[ S[ --c ] ] = false;
if(!dfs(i+)) return false;
}
}
return true;
}
}solver;
int n,m,total_age;
int age[maxn];
bool isyoung(int x){
return x*n<total_age;
}
int main()
{
while(scanf("%d%d",&n,&m)==&&n){
total_age=; for(int i=; i<n; ++i){
scanf("%d",&age[i]);
total_age+=age[i];
} solver.inti(n);
for(int i=; i<m; ++i){
int u,v;
scanf("%d%d",&u,&v); u--; v--;
if(u==v)continue;
solver.add_clause(u, , v , );
if(isyoung(age[u])==isyoung(age[v])){
solver.add_clause( u, , v , );
}
}
if(!solver.solve()) printf("No solution.\n");
else { for(int i=; i<n; i++)
if(solver.mark[i*]) printf("C\n");
else if(isyoung(age[i])) printf("B\n");
else printf("A\n");
}
} return ;
}
uva1391 2-SAT 问题的更多相关文章
- 多边形碰撞 -- SAT方法
检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...
- POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- Map Labeler POJ - 2296(2 - sat 具体关系建边)
题意: 给出n个点 让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...
- 学习笔记(two sat)
关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...
- LA 3211 飞机调度(2—SAT)
https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...
- HIT 1917 2—SAT
题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会. 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委 ...
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- UVA1391/LA3713 Astronauts
题意:有A.B.C3个任务分配给n个宇航员,其中每个宇航员恰好分配一个任务.假设n个宇航员的平均年龄为x,只有年龄大于x的才能领取A任务:只有年龄严格小于x的才能领取B任务,而任务C没有限制.有m对宇 ...
- SAT考试里最难的数学题? · 三只猫的温暖
问题 今天无意中在Quora上看到有人贴出来一道号称是SAT里最难的一道数学题,一下子勾起了我的兴趣.于是拿起笔来写写画画,花了差不多十五分钟搞定.觉得有点意思,决定把解题过程记下来.原帖的图太小,我 ...
随机推荐
- JVM优化(一)-- 入门
一.JVM的概念 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...
- WIN10 X64下通过TLS实现反调试
目录(?)[-] TLS技术简介 1 TLS回调函数 2 TLS的数据结构 具体实现及原理 1 VS2015 X64 release下的demo 2 回调函数的具体实现 21 使用IsDebugger ...
- linux发布项目
1.右击项目 export --->war file 上传到linux服务器 2.解压 jiar -xvf xx.war 3.移动到 tomcat webapps文件中 4.启动tomcat 访 ...
- Eclipse背景与字体大小和xml文件中字体大小设置
1.打开window / Preference,弹出Preference面板 2.展开General标签,选中Editors选项,展开. 3.选中 Text Editors,右边出现 TestEd ...
- 2012Noip提高组Day2 T3 疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...
- hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物
题目1 : 小Hi和小Ho的礼物 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 某人有N袋金币,其中第i袋内金币的数量是Ai.现在他决定选出2袋金币送给小Hi,再选2袋 ...
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...
- 最大网络流(Dinic)
hdu1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 学习c++的50条忠告(转自C++百度贴吧)
1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...
- Oracle数据库类型date
date日期类型 说明 oracle dd-mm-yyyy create table test1(birthday date); timestamp(n) 说明:邮戳的时间类型 于date的区别,邮戳 ...