给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘。同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面。

这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的。

分析:

首先说一下应该注意的是新郎新娘也可能是会有通奸关系出现的,所以一开始必须将他们考虑进去。

为每对夫妇设立一个变量,xi,1表示妻子和新娘坐在同侧,否则表示丈夫和新郎坐在同侧。然后用mark[2*i], mark[2*i^1]被标记时表示假,真,一开始应该将mark[1]标记。

然后考虑通奸关系:

i和j同为男时,应该满足非xi∨非xj;

i和j同为女时,应该满足xi∨xj;

i和j不同性别时,例如i男,j女,应该满足非xi∨xj。

总结起来就是一对关系中:男应该满足非xi,女应该满足xi。

代码:

  1. #include <iostream>
  2. #include <sstream>
  3. #include <cstdio>
  4. #include <climits>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <string>
  8. #include <stack>
  9. #include <map>
  10. #include <cmath>
  11. #include <vector>
  12. #include <queue>
  13. #include <algorithm>
  14. #define esp 1e-6
  15. #define pi acos(-1.0)
  16. #define pb push_back
  17. #define mp(a, b) make_pair((a), (b))
  18. #define in freopen("in.txt", "r", stdin);
  19. #define out freopen("out.txt", "w", stdout);
  20. #define print(a) printf("%d\n",(a));
  21. #define bug puts("********))))))");
  22. #define stop system("pause");
  23. #define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)
  24.  
  25. #define inf 0x0f0f0f0f
  26.  
  27. using namespace std;
  28. typedef long long LL;
  29. typedef vector<int> VI;
  30. typedef pair<int, int> pii;
  31. typedef vector<pii,int> VII;
  32. typedef vector<int>:: iterator IT;
  33. const int maxn = 100000;
  34. struct TwoSAT
  35. {
  36. int n, mark[maxn*2], S[maxn*2], c;
  37. VI g[maxn*2];
  38. bool dfs(int x)
  39. {
  40. if(mark[x^1]) return false;
  41. if(mark[x]) return true;
  42. mark[x] = 1;
  43. S[c++] = x;
  44. for(int i = 0; i < g[x].size(); i++)
  45. {
  46. if(!dfs(g[x][i])) return false;
  47. }
  48. return true;
  49. }
  50. void init(int n)
  51. {
  52. this->n = n;
  53. for(int i = 0; i < maxn; i++)
  54. g[i].clear();
  55. memset(mark, 0, sizeof(mark));
  56. mark[1] = 1;
  57. }
  58. void add(int x, int xval, int y, int yval)
  59. {
  60. x = 2*x+xval;
  61. y = 2*y+yval;
  62. g[x^1].pb(y);
  63. g[y^1].pb(x);
  64. }
  65. bool solve(int n)
  66. {
  67. for(int i = 0; i < 2*n; i += 2)
  68. {
  69. if(!mark[i] && !mark[i+1])
  70. {
  71. c = 0;
  72. if(!dfs(i))
  73. {
  74. while(c) mark[S[--c]] = false;
  75. if(!dfs(i+1)) return false;
  76. }
  77. }
  78. }
  79. return true;
  80. }
  81. } sat;
  82. int main(void)
  83. {
  84. int n, m;
  85. while(scanf("%d%d", &n, &m), n||m)
  86. {
  87. char ch1, ch2;
  88. sat.init(n);
  89. int u, v, xval, yval;
  90. while(m--)
  91. {
  92. scanf("%d%c%d%c", &u, &ch1, &v, &ch2);
  93. xval = (ch1 == 'w') ? 1 : 0;
  94. yval = (ch2 == 'w') ? 1 : 0;
  95. sat.add(u, xval, v, yval);
  96. }
  97. if(sat.solve(n))
  98. {
  99. for(int i = 1; i < n; i++)
  100. printf("%d%c%c", i, sat.mark[2*i] ? 'h' : 'w', i == n-1 ? '\n' : ' ');
  101. }
  102. else puts("bad luck");
  103. }
  104. return 0;
  105. }

UVA 11294 Wedding的更多相关文章

  1. UVA 11294 - Wedding(Two-Set)

    UVA 11294 - Wedding 题目链接 题意:有n对夫妻,0号是公主.如今有一些通奸关系(男男,女女也是可能的)然后要求人分配在两側.夫妻不能坐同一側.而且公主对面一側不能有两个同奸的人,问 ...

  2. UVA 11294 Wedding(2-sat)

    2-sat.不错的一道题,学到了不少. 需要注意这么几点: 1.题目中描述的是有n对夫妇,其中(n-1)对是来为余下的一对办婚礼的,所以新娘只有一位. 2.2-sat问题是根据必然性建边,比如说A与B ...

  3. UVa 11294 Wedding (TwoSat)

    题意:有 n-1 对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻 ...

  4. UVA 11294 wedding 2-sat

    可以把一对夫妇当成一个节点,然后拆点的话,h和w分别为真和假,然后直接按照题目中说的建图染色即可 #include <iostream> #include <cstdio> # ...

  5. Wedding UVA - 11294(2-SAT男女分点)

    题意: 有N-1对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻不 ...

  6. uva 11294

    Problem E: Wedding Up to thirty couples will attend a wedding feast, at which they will be seated on ...

  7. UVa 11450 - Wedding shopping

    题目大意:我们的朋友Bob要结婚了,所以要为他买一些衣服.有m的资金预算,要买c种类型的衣服(衬衫.裤子等),而每种类型的衣服有k个选择(只能做出一个选择),每个选择的衣服都有一个价格,问如何选择才能 ...

  8. Uva 11294 婚姻

    题目链接:https://vjudge.net/contest/166461#problem/C 题意: n对夫妻,有m对人吵过架,不能排在同一边,求新娘的一边的人: 分析: 每对夫妻,看成两个点,女 ...

  9. ACM-ICPC Dhaka Regional 2012 题解

    B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...

随机推荐

  1. Logcat中报内存泄漏MemoryLeak的一次分析

    有时候运行APP的时候Logcat中会报错,提示资源没有释放,Memory leak, 于是打开Android Studio在Android Monitor工具栏点开,有Logcat和Monitors ...

  2. java web 优化札记

    1.效果最明显最简单最省事的优化是SSD,一般优化效率3倍起,(未必对,但是说明很多瓶颈问题都是存储问题) 2.垂直扩容省了开发时间,短期来看是最快的,缺点是会消耗更多的资源,而且有瓶颈,另外如果应用 ...

  3. .bak文件在英文版的sqlserver2014如何生成和恢复

    生成bak备份文件 1.选择数据库 2.右击选择task 3.选择backup 4.

  4. 添加数据库的Maven依赖(SqlServer,Oracle)

    oracle: 1.在Oracle官网下载ojdbc的jar包 例:ojdbc7.jar,版本是12.1.0.2,存储地址/home/peng/下载 2.dos中进入存储地址执行如下命令行(注意各项对 ...

  5. JavaScript对象应用-字符串和图片对象

    1.1 应用 String对象截取特定文字   利用String 对象的charAt() 和 substring() 方法等,截取特定文字或字段文字显示在页面上 <html> <he ...

  6. mysql innodb 数据打捞(二)innodb 页面打捞编程

    有了页面的结构和特征,需要编程实现数据库页面的打捞工作: 为了方便windows and linux 的通用,计划做成C语言的控制台应用,并且尽量只用ansi c;关于多线程,计划做成多线程的程序,最 ...

  7. 解决:error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'

    在使用 deamon@deamon-H55M-S2:/usr/bin$ mysqladmin -u root -p shutdown 关闭MySQL之后试图通过: deamon@deamon-H55M ...

  8. Headfirst设计模式的C++实现——外观模式(Facade)

    light.h #ifndef _LIGHT_H_ #define _LIGHT_H_ #include <iostream> class LIGHT { public: void dim ...

  9. JSP九大内置对象和四个作用域

    JSP九大内置对象和四个作用域 在学习JSP的时候,首先就要先了解JSP的内置对象,什么是内置对象呢?内置对象也叫隐含对象,就是不需要预先声明就可以在脚本代码和表达式中随意使用.而这样的内置对象在JS ...

  10. docker+tomcat+java配置(ubuntu)

    原创文章,转载请注明出处. 本文是基于ubuntu14.04搭建的dosker,tomcat配置是在docker容器外面(为了方便查看日志)使用的是docker启动挂载,该tomcat工程依赖于doc ...