题目链接:http://poj.org/problem?id=3648

  题意:一对情人举行婚礼,有n对夫妇参加,别人对着坐在一个长桌子的两边,新娘和新郎坐在最后面,新娘只能看见坐在他对面的人。现在,n对夫妇中有两两通奸了,新娘不希望看到这种情况,先给出通奸的人,求是否存在可行的排位方法。

  有两种建立2sat模型的方法,第一种是对每个人的坐的方向来建立,0和1分别表示坐在左边和右边。但是可以不考虑坐方向,只考虑他们能不能坐在同一边,需要考虑新郎的一边,因为新娘那边得不出限制条件。

  1. //STATUS:C++_AC_16MS_180KB
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. //#include <ext/rope>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <numeric>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <string>
  14. #include <vector>
  15. #include <bitset>
  16. #include <queue>
  17. #include <stack>
  18. #include <cmath>
  19. #include <ctime>
  20. #include <list>
  21. #include <set>
  22. #include <map>
  23. using namespace std;
  24. //using namespace __gnu_cxx;
  25. //define
  26. #define pii pair<int,int>
  27. #define mem(a,b) memset(a,b,sizeof(a))
  28. #define lson l,mid,rt<<1
  29. #define rson mid+1,r,rt<<1|1
  30. #define PI acos(-1.0)
  31. //typedef
  32. typedef long long LL;
  33. typedef unsigned long long ULL;
  34. //const
  35. const int N=;
  36. const int INF=0x3f3f3f3f;
  37. const int MOD=,STA=;
  38. const LL LNF=1LL<<;
  39. const double EPS=1e-;
  40. const double OO=1e15;
  41. const int dx[]={-,,,};
  42. const int dy[]={,,,-};
  43. const int day[]={,,,,,,,,,,,,};
  44. //Daily Use ...
  45. inline int sign(double x){return (x>EPS)-(x<-EPS);}
  46. template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
  47. template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
  48. template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
  49. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  50. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  51. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  52. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  53. template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
  54. template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
  55. //End
  56.  
  57. int first[N*],next[N*N*],vis[N*],S[N*];
  58. int n,m,mt,cnt;
  59.  
  60. struct Edge{
  61. int u,v;
  62. }e[N*N*];
  63.  
  64. void adde(int a,int b)
  65. {
  66. e[mt].u=a,e[mt].v=b;
  67. next[mt]=first[a];first[a]=mt++;
  68. }
  69.  
  70. int dfs(int u)
  71. {
  72. if(vis[u^])return ;
  73. if(vis[u])return ;
  74. int i;
  75. vis[u]=;
  76. S[cnt++]=u;
  77. for(i=first[u];i!=-;i=next[i]){
  78. if(!dfs(e[i].v))return ;
  79. }
  80. return ;
  81. }
  82.  
  83. int Twosat()
  84. {
  85. int i,j;
  86. for(i=;i<n;i+=){
  87. if(vis[i] || vis[i^])continue;
  88. cnt=;
  89. if(!dfs(i)){
  90. while(cnt)vis[S[--cnt]]=;
  91. if(!dfs(i^))return ;
  92. }
  93. }
  94. return ;
  95. }
  96.  
  97. int main()
  98. {
  99. // freopen("in.txt","r",stdin);
  100. int i,j,a,b,x,y,flag;
  101. char c1,c2;
  102. while(~scanf("%d%d",&n,&m) && (n||m))
  103. {
  104. n<<=;
  105. mem(first,-);
  106. mem(vis,);mt=;
  107. adde(,);
  108. for(i=;i<m;i++){
  109. scanf("%d%c%d%c",&a,&c1,&b,&c2);
  110. x=(a<<)+(c1=='h'?:);
  111. y=(b<<)+(c2=='h'?:);
  112. // printf("%d %d %d %d\n",x,y,x^1,y^1);
  113. adde(x,y^);
  114. adde(y,x^);
  115. }
  116.  
  117. if(Twosat()){
  118. // for(i=0;i<n;i+=2)
  119. // printf("%d %d\n",vis[i],vis[i+1]);
  120.  
  121. printf("%d%c",,vis[]==vis[]?'h':'w');
  122. for(i=;i<n;i+=){
  123. printf(" %d%c",i/,vis[i]==vis[]?'h':'w');
  124. }
  125. }
  126. else printf("bad luck");
  127. putchar('\n');
  128. }
  129. return ;
  130. }

POJ-3648 Wedding 2sat的更多相关文章

  1. POJ 3648 Wedding (2-SAT,经典)

    题意:新郎和新娘结婚,来了n-1对夫妻,这些夫妻包括新郎之间有通奸关系(包括男女,男男,女女),我们的目地是为了满足新娘,新娘对面不能坐着一对夫妻,也不能坐着有任何通奸关系的人,另外新郎一定要坐新娘对 ...

  2. POJ.3648.Wedding(2-SAT)

    题目链接 题意看这吧..https://www.cnblogs.com/wenruo/p/5885948.html \(Solution\) 每对夫妇只能有一个坐在新娘这一边,这正符合2-SAT初始状 ...

  3. poj 3648 Wedding 2-SAT问题入门题目

    Description Up to thirty couples will attend a wedding feast, at which they will be seated on either ...

  4. POJ - 3648 Wedding (2-SAT 输出解决方案)

    题意:有N-1对夫妇和1对新郎新娘要出席婚礼,这N对人要坐在走廊两侧.要求每对夫妇要坐在不同侧.有M对人有通奸关系,对于这一对人,不能同时坐在新娘对面(新娘新郎也可能和别人有通奸关系).求如何避免冲突 ...

  5. POJ 3648 Wedding(2-SAT的模型运用+DFS | Tarjan)

    Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 3170   Specia ...

  6. poj 3648 Wedding【2-SAT+tarjan+拓扑】

    看错题*n,注意是输出新娘这边的-- 按2-SAT规则连互斥的边,然后注意连一条(1,1+n)表示新娘必选 然后输出color[belong[i]]==color[belong[1+n(新娘)]]的点 ...

  7. POJ 3648 Wedding

    2-SAT,直接选择新娘一侧的比较难做,所以处理的时候选择新郎一侧的,最后反着输出就可以. A和B通奸的话,就建边 A->B'以及B->A’,表示 A在新郎一侧的话,B一定不在:B在新郎一 ...

  8. Wedding (poj 3648 2-SAT 输出随意一组解)

    Language: Default Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9004   Accept ...

  9. 【POJ】3648 Wedding

    http://poj.org/problem?id=3648 题意:n对人(编号0-n-1,'w'表示第一个人,'h'表示第二个人),每对两个,人坐在桌子两侧.满足:1.每对人中的两个人不能坐在同一侧 ...

  10. poj 3648 2-SAT问题

    思路:将每对夫妻看成是对立状态,每个不正常关系都是一个矛盾,按2-SAT的方式建边.最后建一条新娘到新郎的边.具体看注释 #include<iostream> #include<cs ...

随机推荐

  1. 2014年度辛星html教程夏季版第七节

    经过前面六节的学习,我们大致清楚了HTML教程中的基础内容,那么接下来我们开始继续向后推进,可以说,下面我们介绍一下HTML中的区块. ***************区块*************** ...

  2. chrome常用插件

    1. ModHeader 功能:修改请求头部信息 安装地址:https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnf ...

  3. Vm image download resource

    http://vmdepot.msopentech.com/List/Index http://www.hanselman.com/blog/Over400VirtualMachineImagesOf ...

  4. .NET(C#):灵活运用CryptoStream,加密不是必须用CryptoStreamMode.Write

    首先.NET中的ICryptoTransform是单向的,也就是只能从一个状态将数据转化成另一个状态,反之是不可以的.当然手动 操作ICryptoTransform还是比较繁琐的,通过CryptoSt ...

  5. 体验Openstack--感觉这个比HADOOP还要基础啊

    当然,这两者应该是可以整到一起的..这个和ESX是什么关系叫?? 今天闲时慢慢按文档整了一个大概出来.. http://www.linuxidc.com/Linux/2013-01/78253p3.h ...

  6. 从 C++ 到 Qt(命令行编译)good

    从 C++ 到 Qt 转载自:http://hi.baidu.com/cyclone/blog/item/8f8f08fa52d22f8758ee9006.html Qt 是 C++ 的库,Qt在an ...

  7. Android Integer.decode()和Intger.valueof()

    decode合适用来分析数字 可以分析 8进:010=>分析后为 8 10进:10=>分析后为 10 16进:#10|0X10|0x10=>分析后是 16 而valueof    只 ...

  8. 你所不知道的string.xml

    String 能被应用程序或者其他资源文件(比如layout XML)引用的单个字符串. 注意:字符串是简单类型资源,是用名称(name)(而非XML文件名)来直接引用的.因此,在一个XML文件里,可 ...

  9. [Quick-x]制作新手引导高亮区域方法之一:混合模式

    demo下载:https://github.com/chenquanjun/Quick-x-HighlightArea 1.混合模式 (1)首先创建一个全屏的CCRenderTexture实例 这里使 ...

  10. YII CJson类

    CJson文档: http://www.yiiframework.com/doc/api/1.1/CJSON CJson::encode可以编码任何类型的数据:源码如下: public static ...