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的更多相关文章
随机推荐
- JavaScript流程控制及函数
1 流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code...} 双向分支 if (条件表达式){ } else { } <!DOCTYPE html& ...
- ORM框架学习之EF
首先推荐一篇很好的EF文章翻译,可以系统的学习一遍. <Entity Framework 6 Recipes>中文翻译系列 EF使用体会 优点: 可以省去Ado.net复杂的管道连接代码. ...
- 开箱即用 - Memcache缓存
废话少说,先上代码C# memcache Demo memcache 是服务器缓存系统,以键值对方式保存数据到内存中,把对象序列化后,理论上可支持所有的数据类型. 使用情景:怎么用都可以,注意的是它只 ...
- 【轮子狂魔】手把手教你自造Redis Client
为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...
- 「功能笔记」Linux常用Shell命令(终端命令)备忘录
长期更新,空置.缺漏的部分会逐渐补上.未指明时,均为GNU版本. 文件命令 基础操作 ls 默认显示非隐藏文件.以文件名进行排序.文件名有颜色(蓝色文件夹.白色一般文件.绿色可执行文件). Cheat ...
- EasyUI系列学习笔记(一)——注册
前面介绍过EasyUI是一个前段框架,开发之前需要导入底层包:我这里采用的是EasyUI 1.4版本~ 今天主要是搭建一个EasyUI的环境,同时做一个登陆页面... 环境搭建 导入需要的文件到项目中 ...
- 在Visual Studio中使用.lib和.dll的环境搭建
1 静态库和动态链接库的区别 动态链接库是在运行的时候被调用的,静态库在链接的时候被链接到最终生成的应用程序(.exe)中 静态库需要用到的文件 (.lib .h) 头文件(.h)提供接口,库文件(. ...
- Ubuntu下配置Anaconda
转自:https://blog.csdn.net/Horcham/article/details/57075388 安装Anaconda Ubuntu下似乎库中不自带Anaconda,是自带纯净的py ...
- OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?
版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...
- php从入门到放弃系列-03.php函数和面向对象
php从入门到放弃系列-03.php函数和面向对象 一.函数 php真正的威力源自它的函数,内置了1000个函数,可以参考PHP 参考手册. 自定义函数: function functionName( ...