大型补档计划

题目链接

根据题意,显然只有新郎这边可能存在矛盾,考虑这边怎么放即可,新娘那边的放法与这边正好相反且一一对应。

显然对于两个约束条件是一对矛盾,开始我以为可以用并查集,后来发现输出方案的时候,如果两者都可以的话不会选了只能乱选,有可能会限制死某些变量,需要指数级别 \(dfs\) 搞,然后就放弃了。

设 \([0, n - 1]\) 是这个位置放妻子,\([n, 2 * n - 1]\) 是这个位置放丈夫。

对于这种矛盾 \(a, b\),构建 2-SAT 模型就是连边 \((a, opp[b]), (b, opp[a])\) (opp表示同样位置的对应元素。)

方案输出按照板子输出即可,注意输出的是新娘一边的,正好我们求的新郎正相反

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 65, M = 2005;
int n, m, dfn[N], low[N], dfncnt, s[N], top, c[N], cnt;
bool ins[N];
int opp(int x) { return x <= n - 1 ? x + n : x - n; }
int head[N], numE = 0;
struct E{
int next, v;
} e[M];
void add(int u, int v) {
e[++numE] = (E) { head[u], v };
head[u] = numE;
}
void tarjan(int u) {
dfn[u] = low[u] = ++dfncnt;
ins[u] = true, s[++top] = u;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if(ins[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
int v; ++cnt;
do {
v = s[top--], c[v] = cnt, ins[v] = false;
} while (v != u);
}
}
void clear() {
memset(dfn, 0, sizeof dfn);
memset(head, 0, sizeof head);
memset(c, 0, sizeof c);
memset(ins, false, sizeof ins);
numE = dfncnt = top = cnt = 0;
}
bool check() {
for (int i = 0; i <= n - 1; i++) if (c[i] == c[i + n]) return false;
return true;
}
int main() {
while(scanf("%d%d", &n, &m), n || m) {
clear();
add(0, n);
for (int i = 1, x, y; i <= m; i++) {
char a, b; scanf("%d%c%d%c", &x, &a, &y, &b);
if (a == 'h') x += n;
if (b == 'h') y += n;
add(x, opp(y)), add(y, opp(x));
}
for (int i = 0; i <= 2 * n - 1; i ++) if (!dfn[i]) tarjan(i);
if (!check()) puts("bad luck");
else {
for (int i = 1; i <= n - 1; i++) printf("%d%c ", i, c[i] < c[i + n] ? 'h' : 'w');
puts("");
}
}
}

最新文章

  1. 用FLASH,安智和IOS打电话方法
  2. isEmpty与null、&quot;&quot;的区别
  3. jdk1.8 J.U.C之FutureTask实现机制分析
  4. RHEL7文件管理
  5. 在Windows上一键编译各种版本的Protobuf
  6. 数组乘积--满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出
  7. a2x
  8. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.3
  9. Ubuntu 12.04如何从登录界面登录root
  10. G - 小希的迷宫(并查集)
  11. log翻硬币
  12. linux-mint下搭建android,angularjs,rails,html5开发环境 - qijie29896的个人空间 - 开源中国社区
  13. django入门基础
  14. Python调用外部程序——os.system()和subprocess.call
  15. Oracle分析函数——函数列表
  16. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
  17. jmeter访问mysql数据库
  18. input框的输入限制
  19. Python读取大文件的&quot;坑“与内存占用检测
  20. 腾讯云CentOS 安装 Hadoop 2.7.3

热门文章

  1. 运维和shell
  2. Java 架构学习图谱
  3. 《Machine Learning in Action》—— 小朋友,快来玩啊,决策树呦
  4. rinetd小工具
  5. MySQL如何实现万亿级数据存储?
  6. MathType中如何实现上下两行公式“=”号对齐
  7. 使用Camtasia制作冰雪奇缘视频
  8. 推荐一款比迅雷下载速度快的mac下载器
  9. 利用MathType在Word里输入几何符号的技巧
  10. 需要登录才能下载的文件可以用Folx下载吗