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的更多相关文章
随机推荐
- 128 C语言实现文件复制功能(包括文本文件和二进制文件)
文件的复制是常用的功能,要求写一段代码,让用户输入要复制的文件以及新建的文件,然后对文件进行复制.能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档. 实现 ...
- 使用ASP.NET Identity以手机短信实现双重验证
这篇文章将展示怎么使用SMS短信启动双重验证 创建一个ASP.NET 5项目 一开始,使用Visual studio 2015创建一个新的ASP.NET Web应用程序: 在下一步中选择ASP.NET ...
- 网络知识 ACL NAT IPv6
第1章 ACL 访问控制列表 访问控制表(Access Control List,ACL),又称存取控制串列,是使用以访问控制矩阵为基础的访问控制方法,每一个对象对应一个串列主体. 访问控制表描述每一 ...
- css布局笔记(三)圣杯布局,双飞翼布局
圣杯布局和双飞翼布局都是三列布局,两边定宽,中间自适应布局,中间栏要在放在文档流前面以优先渲染. 圣杯布局如下 <!-- 圣杯布局 --> <!DOCTYPE html> &l ...
- 011 --Mysql中特定查询
1.优化COUNT()查询 COUNT()可能是被大家误解最多的函数了,它有两种不同的作用,其一是统计某个列值的数量,其二是统计行数.统计列值时,要求列值是非空的,它不会统计NULL.如果确认括号中的 ...
- .NET处理Json的几种方式
序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json. json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐 ...
- docker node项目 连接mongodb
在弄docker部署node项目的时候遇到了连接mongdb的问题,记录一下问题解决办法 一.Docker 安装 MongoDB 1.查找Docker Hub上的mongo镜像 [root@VM_49 ...
- 从零开始的Python学习Episode 20——面向对象(3)
面向对象之封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体. 隐藏 在python中用双下划线开 ...
- 小球下落(Dropping Balls, Uva 679)
题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...
- nohup命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/hfismyangel/article/details/80258126 1.nohup 用途:不挂断地运行命令. 语法:n ...