UVALive3713_Astronauts
有n个宇航员,根据年龄限制,所有宇航员只能从事A或B中的一种任务,所有人都可以从事C的任务。有的宇航员之间相互讨厌,不能分在一组,求出一种满足条件的分配方案。
2sat。mark[]中i+i和i+i+1分别表示i从事C工作或者他的特有工作。
对于仇恨关系,我们可以知道U和V两个人不能同时从事C工作。于是加边 (U+U,V+V+1),(V+V,U+U+1)。
同时,如果这两个人的特有工作相同,那么还需要加边(U+U+1,V+V),(V+V+1,U+U)。
召唤代码君:
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 5555550
using namespace std; int age[maxn],n,m;
int next[maxn],to[maxn],first[maxn],edge;
bool mark[maxn];//0 C \ 1 A|B
int Q[maxn],top;
double avg; void addedge(int U,int V)
{
edge++;
to[edge]=V,next[edge]=first[U],first[U]=edge;
} bool dfs(int cur)
{
if (mark[cur^]) return false;
if (mark[cur]) return true;
Q[++top]=cur,mark[cur]=true;
for (int i=first[cur]; i!=-; i=next[i])
if (!dfs(to[i])) return false;
return true;
} int main()
{
int U,V;
while (scanf("%d%d",&n,&m) && (n|m))
{
avg=,edge=-;
for (int i=; i<=n; i++)
{
scanf("%d",&age[i]);
avg+=age[i];
mark[i+i]=mark[i+i+]=false;
first[i+i]=first[i+i+]=-;
}
avg/=n;
while (m--)
{
scanf("%d%d",&U,&V);
addedge(U+U,V+V+),addedge(V+V,U+U+);
if ((age[U]<avg)^(age[V]<avg)) continue;
addedge(U+U+,V+V),addedge(V+V+,U+U);
}
bool flag=true;
for (int i=; i<=n; i++)
{
if (mark[i+i] || mark[i+i+]) continue;
top=;
if (!dfs(i+i))
{
while (top) mark[Q[top--]]=false;
if (!dfs(i+i+))
{
flag=false;
break;
}
}
}
if (flag)
{
for (int i=; i<=n; i++)
if (mark[i+i]) printf("C\n");
else printf("%c\n",age[i]>=avg?'A':'B');
}
else puts("No solution.");
}
return ;
}
UVALive3713_Astronauts的更多相关文章
随机推荐
- 为什么Python类成员的调用和声明必须有"this"?
Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的.我们对比Python和C++讨论一下这个问题: Modula-3是上世纪80年代末数字设备公司( ...
- django 部署一个简单的博客系统
转:https://www.cnblogs.com/fnng/p/3737964.html 写的目的, 加深影响,熟悉开发流程, 开发都是练出来的. 环境 python3.5 windows 7 1. ...
- TPO-19 C1 Discussing A Point Raised In A Lecture
TPO-19 C1 Discussing A Point Raised In A Lecture 第 1 段 1.Listen to a conversation between a student ...
- 有序链表转换二叉搜索树(LeetCode)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- 011 --Mysql中特定查询
1.优化COUNT()查询 COUNT()可能是被大家误解最多的函数了,它有两种不同的作用,其一是统计某个列值的数量,其二是统计行数.统计列值时,要求列值是非空的,它不会统计NULL.如果确认括号中的 ...
- SICP读书笔记 2.4
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- Netty源码分析第2章(NioEventLoop)---->第3节: 初始化线程选择器
Netty源码分析第二章:NioEventLoop 第三节:初始化线程选择器 回到上一小节的MultithreadEventExecutorGroup类的构造方法: protected Multi ...
- Netty源码分析第5章(ByteBuf)---->第9节: ByteBuf回收
Netty源码分析第五章: ByteBuf 第九节: ByteBuf回收 之前的章节我们提到过, 堆外内存是不受jvm垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf操作时, 使用完毕 ...
- python-五行红旗实现
import turtle """ 绘制五星红旗 作者:zxj 版本:1.0 """ # 绘制矩形函数 def giant(leg,hig) ...
- PHP 预定义变量
1.$_SERVER <?php $a=$_SERVER; var_dump($a); ?> 2.$_FILES <?php if($_FILES){ echo "< ...