传送门

\(2-sat\)的模板题,首先得出题目中的二元关系为:对于有矛盾的\(x_i,x_j\),至多选择一个,那么连边\(x_i\rightarrow x_j',x_j\rightarrow x_i'\)。

在这里这个关系是明确的关系,我们连边时只用连明确的关系即可。假设不选\(x_i\),我们也不知道\(x_j\)选不选,可选可不选,所以不用从\(x_i'\)出发连边。

然后题目因为要求字典序最小,据说\(trajan\)缩点那样搞可能出问题,因为数据范围比较小,所以直接\(O(nm)\)暴力染色就行了QAQ

代码如下:

  1. /*
  2. * Author: heyuhhh
  3. * Created Time: 2019/11/29 14:52:58
  4. */
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <cmath>
  9. #include <set>
  10. #include <map>
  11. #include <cstring>
  12. #include <iomanip>
  13. #define MP make_pair
  14. #define fi first
  15. #define se second
  16. #define sz(x) (int)(x).size()
  17. #define all(x) (x).begin(), (x).end()
  18. #define INF 0x3f3f3f3f
  19. #define Local
  20. #ifdef Local
  21. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  22. void err() { std::cout << '\n'; }
  23. template<typename T, typename...Args>
  24. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  25. #else
  26. #define dbg(...)
  27. #endif
  28. void pt() {std::cout << '\n'; }
  29. template<typename T, typename...Args>
  30. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  31. using namespace std;
  32. typedef long long ll;
  33. typedef pair<int, int> pii;
  34. //head
  35. const int N = 8005;
  36. int n, m;
  37. vector <int> g[N << 1];
  38. int get(int x) {
  39. if(x % 2) return x + 1;
  40. return x - 1;
  41. }
  42. int cnt;
  43. int col[N << 1], tmp[N];
  44. bool paint(int x) {
  45. if(col[x]) {
  46. if(col[x] % 2 == 0) return false;
  47. return true;
  48. }
  49. tmp[++cnt] = x;
  50. col[x] = 1; col[get(x)] = 2;
  51. for(auto y : g[x]) {
  52. if(!paint(y)) return false;
  53. }
  54. return true;
  55. }
  56. bool work() {
  57. memset(col, 0, sizeof(col));
  58. for(int i = 1; i <= 2 * n; i++) {
  59. if(col[i]) continue;
  60. cnt = 0;
  61. if(!paint(i)) {
  62. for(int j = 1; j <= cnt; j++) col[tmp[j]] = col[get(tmp[j])] = 0;
  63. cnt = 0;
  64. if(!paint(get(i))) return false;
  65. }
  66. }
  67. return true;
  68. }
  69. void run(){
  70. for(int i = 1; i <= 2 * n; i++) g[i].clear();
  71. for(int i = 1; i <= m; i++) {
  72. int u, v; cin >> u >> v;
  73. g[u].push_back(get(v));
  74. g[v].push_back(get(u));
  75. g[get(u)].push_back(v);
  76. g[get(v)].push_back(u);
  77. }
  78. if(work()) {
  79. for(int i = 1; i <= 2 * n; i++)
  80. if(col[i] == 1) cout << i << '\n';
  81. } else cout << "NIE" << '\n';
  82. }
  83. int main() {
  84. ios::sync_with_stdio(false);
  85. cin.tie(0); cout.tie(0);
  86. cout << fixed << setprecision(20);
  87. while(cin >> n >> m) run();
  88. return 0;
  89. }

【HDU1814】Peaceful Commission(2-sat+暴力染色)的更多相关文章

  1. hdu1814 Peaceful Commission

    hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include &l ...

  2. HDU1814(Peaceful Commission) 【2-SAT DFS暴力求最小字典序的模板】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 题意:给出一个数n,代表有n个党派,每个党派要求派出其中一个人去参加会议,且只能派出一人.给出m ...

  3. HDU1814 Peaceful Commission 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8099115.html 题目传送门 - HDU1814 题面 Description 根据宪法,Byteland民 ...

  4. hdu1814 Peaceful Commission——2-SAT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1814 第一次的2-SAT,推荐博客:https://blog.csdn.net/jarjingx/arti ...

  5. HDU-1814 Peaceful Commission 2sat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 简单的2sat题. //STATUS:C++_AC_390MS_996KB #include & ...

  6. hdu1814 Peaceful Commission,2-sat

    题目大意:一国有n个党派.每一个党派在议会中都有2个代表,现要组建和平委员会,要从每一个党派在议会的代表中选出1人,一共n人组成和平委员会.已知有一些代表之间存在仇恨,也就是说他们不能同一时候被选为和 ...

  7. 【2-SAT(最小字典序/暴力染色)】HDU1814-Peaceful Commission

    [题目大意] 和平委员会每个党派有2个人,只能派出其中1个,其中有一些人之间互相讨厌不能同时派出.求出派遣方案,如果有多种方案输出字典序最小的方案. [思路] 最小字典序只能用暴力染色.初始时均没有染 ...

  8. 2-sat——暴力染色输出方案hdu1814

    因为要求输出字典序最小的解,所以用暴力染色 具体有点像二分图染色 遍历0-2*n-1个点,尝试将每个点染成1,该点所能到达的所有点都要染成1 如果不行,则把上该点的影响消除,再把对立点染成1,如果还不 ...

  9. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

随机推荐

  1. docker in docker 的启动方式

    --privileged  -v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):/bin/docker 启动容器时添加上面 ...

  2. linux下Oracle与swap分区大小配置规划

    Oracle于Linux系统---交换空间大小规划 分三种常用情况(1)实际内存为1GB~2GB建议交换空间为内存的1.5倍 (2)实际内存为2GB~8GB建议交换空间与内存相同 (3)实际内存超过8 ...

  3. 微信支付和微信支付通知基于sdk的说明(2)

    前期准备工作 微信商户账户/密码(获取appid等信息) 微信公众号账户/密码(获取cert证书等信息,不做线上退款不需要证书) 下载php支付demo 从商户平台进入的话是以下界面或者直接搜索公众号 ...

  4. jQuery实现简单的tab切换

    html: <section>   <nav id="nav">     <a class="on">tab1</a& ...

  5. 关于xshell连接limux界面按退格键不正常的问题

    这个问题通过修改xshell终端属性可以解决,步骤如下: "文件" -> "属性" -> "终端" -> "键盘 ...

  6. Linux自动同步时间

    一.安装时间同步工具 yum -y install ntp 二.同步时间 1.修改时区 cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime v ...

  7. SPA项目开发之tab页实现

    实现思路及细节 1.利用前面博客所讲的Vuex的知识:定义几个变量 Options:存放tab页对象的容器(主要是路由路径以及tab页的名字) activeIndex:被激活的tab页路由路径 sho ...

  8. 6. java 方法

    一.方法定义格式 修饰符 返回值类型 方法名称(参数类型 参数名称, ...){ 方法体; return 返回值; } 1. 修饰符:现阶段固定写法,public static 2. 参数如果有多个, ...

  9. Java笔记(持续更新)

    码云地址    https://gitee.com/MarkPolaris/Java_Mark

  10. linux与ubuntu下vsftp的安装使用

    vsftp工具是linux与类linux系统上常用的ftp传输工具,按百度上的说法,它的不同点与好处有九点,不明觉厉,有兴趣的可以深入验证: 一.它是一个安全.高速.稳定的FTP服务器: 二.它可以做 ...