有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)。

召唤代码君:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define maxn 5555550
  5. using namespace std;
  6.  
  7. int age[maxn],n,m;
  8. int next[maxn],to[maxn],first[maxn],edge;
  9. bool mark[maxn];//0 C \ 1 A|B
  10. int Q[maxn],top;
  11. double avg;
  12.  
  13. void addedge(int U,int V)
  14. {
  15. edge++;
  16. to[edge]=V,next[edge]=first[U],first[U]=edge;
  17. }
  18.  
  19. bool dfs(int cur)
  20. {
  21. if (mark[cur^]) return false;
  22. if (mark[cur]) return true;
  23. Q[++top]=cur,mark[cur]=true;
  24. for (int i=first[cur]; i!=-; i=next[i])
  25. if (!dfs(to[i])) return false;
  26. return true;
  27. }
  28.  
  29. int main()
  30. {
  31. int U,V;
  32. while (scanf("%d%d",&n,&m) && (n|m))
  33. {
  34. avg=,edge=-;
  35. for (int i=; i<=n; i++)
  36. {
  37. scanf("%d",&age[i]);
  38. avg+=age[i];
  39. mark[i+i]=mark[i+i+]=false;
  40. first[i+i]=first[i+i+]=-;
  41. }
  42. avg/=n;
  43. while (m--)
  44. {
  45. scanf("%d%d",&U,&V);
  46. addedge(U+U,V+V+),addedge(V+V,U+U+);
  47. if ((age[U]<avg)^(age[V]<avg)) continue;
  48. addedge(U+U+,V+V),addedge(V+V+,U+U);
  49. }
  50. bool flag=true;
  51. for (int i=; i<=n; i++)
  52. {
  53. if (mark[i+i] || mark[i+i+]) continue;
  54. top=;
  55. if (!dfs(i+i))
  56. {
  57. while (top) mark[Q[top--]]=false;
  58. if (!dfs(i+i+))
  59. {
  60. flag=false;
  61. break;
  62. }
  63. }
  64. }
  65. if (flag)
  66. {
  67. for (int i=; i<=n; i++)
  68. if (mark[i+i]) printf("C\n");
  69. else printf("%c\n",age[i]>=avg?'A':'B');
  70. }
  71. else puts("No solution.");
  72. }
  73. return ;
  74. }

UVALive3713_Astronauts的更多相关文章

随机推荐

  1. JavaScript流程控制及函数

    1 流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code...} 双向分支 if (条件表达式){    } else {    } <!DOCTYPE html& ...

  2. ORM框架学习之EF

    首先推荐一篇很好的EF文章翻译,可以系统的学习一遍. <Entity Framework 6 Recipes>中文翻译系列 EF使用体会 优点: 可以省去Ado.net复杂的管道连接代码. ...

  3. 开箱即用 - Memcache缓存

    废话少说,先上代码C# memcache Demo memcache 是服务器缓存系统,以键值对方式保存数据到内存中,把对象序列化后,理论上可支持所有的数据类型. 使用情景:怎么用都可以,注意的是它只 ...

  4. 【轮子狂魔】手把手教你自造Redis Client

    为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...

  5. 「功能笔记」Linux常用Shell命令(终端命令)备忘录

    长期更新,空置.缺漏的部分会逐渐补上.未指明时,均为GNU版本. 文件命令 基础操作 ls 默认显示非隐藏文件.以文件名进行排序.文件名有颜色(蓝色文件夹.白色一般文件.绿色可执行文件). Cheat ...

  6. EasyUI系列学习笔记(一)——注册

    前面介绍过EasyUI是一个前段框架,开发之前需要导入底层包:我这里采用的是EasyUI 1.4版本~ 今天主要是搭建一个EasyUI的环境,同时做一个登陆页面... 环境搭建 导入需要的文件到项目中 ...

  7. 在Visual Studio中使用.lib和.dll的环境搭建

    1 静态库和动态链接库的区别 动态链接库是在运行的时候被调用的,静态库在链接的时候被链接到最终生成的应用程序(.exe)中 静态库需要用到的文件 (.lib .h) 头文件(.h)提供接口,库文件(. ...

  8. Ubuntu下配置Anaconda

    转自:https://blog.csdn.net/Horcham/article/details/57075388 安装Anaconda Ubuntu下似乎库中不自带Anaconda,是自带纯净的py ...

  9. OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?

    版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...

  10. php从入门到放弃系列-03.php函数和面向对象

    php从入门到放弃系列-03.php函数和面向对象 一.函数 php真正的威力源自它的函数,内置了1000个函数,可以参考PHP 参考手册. 自定义函数: function functionName( ...