题目大意:

  1. 有一对新人结婚,邀请n对夫妇去参加婚礼。
  2. 有一张很长的桌子,人只能坐在桌子的两边,还要满
  3. 足下面的要求:1.每对夫妇不能坐在同一侧 2.n对夫妇
  4. 之中可能有通奸关系(包括男男,男女,女女),有通
  5. 奸关系的不能同时坐在新娘的对面,可以分开坐,可以
  6. 同时坐在新娘这一侧。如果存在一种可行的方案,输出
  7. 与新娘同侧的人。
  8.  
  9. 这里因为输入的是字符串,要注意的是数字可能不只是一个个位数,要

while(isdigit(s1[index1])) i = i*10+(s1[index1++]-'0');
while(isdigit(s2[index2])) j = j*10+(s2[index2++]-'0');

这里自己一直没找到原因,错了很多次

其他的就按照 2i 表示 i 号丈夫坐在新娘对面,2i+1 表示i 号妻子坐在新娘对面

初始将新郎对应的编号的标记设为true , 因为他必然坐在新娘对面

这样找下来,最后标记为false的便是坐在新娘这边的

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <ctype.h>
  5. #include <algorithm>
  6. using namespace std;
  7. #define N 300
  8. int n , m , S[N] , c ;
  9. bool mark[N];
  10. char s1[] , s2[];
  11. vector<int> G[N];
  12.  
  13. void init()
  14. {
  15. memset(mark , , sizeof(mark));
  16. for(int i= ; i<n* ; i++) G[i].clear();
  17. }
  18.  
  19. bool dfs(int u)
  20. {
  21. if(mark[u]) return true;
  22. if(mark[u^]) return false;
  23. mark[u] = true;
  24. S[c++] = u;
  25. for(int i= ; i<G[u].size() ; i++)
  26. if(!dfs(G[u][i])) return false;
  27. return true;
  28. }
  29.  
  30. bool solve()
  31. {
  32. mark[] = true;//一定是坐在新娘对面,所以新郎为true
  33. for(int i= ; i<*n ; i+=){
  34. if(!mark[i] && !mark[i^]){
  35. c = ;
  36. if(!dfs(i)){
  37. while(c) mark[S[--c]] = false;
  38. if(!dfs(i^)) return false;
  39. }
  40. }
  41. }
  42. return true;
  43. }
  44.  
  45. void add_clause(int i , int p , int j , int q)
  46. {
  47. int m = *i+p , n = *j+q;
  48. G[m].push_back(n^);
  49. G[n].push_back(m^);
  50. }
  51.  
  52. int main()
  53. {
  54. // freopen("in.txt" , "r" , stdin);
  55. while(scanf("%d%d" , &n , &m) , n+m)
  56. {
  57. init();
  58. while(m--){
  59. scanf("%s%s" , s1 , s2);
  60. int i , j , p , q;
  61. i = , j = ;
  62. int index1 = , index2 = ;
  63. while(isdigit(s1[index1])) i = i*+(s1[index1++]-'');
  64. while(isdigit(s2[index2])) j = j*+(s2[index2++]-'');
  65. p = s1[index1]=='h'?: , q = s2[index2]=='h'?:;
  66. add_clause(i , p , j ,q);
  67. }
  68. if(!solve()) puts("bad luck");
  69. else{
  70. int flag = ;
  71. for(int i= ; i<n* ; i++){
  72. if(!mark[i]){
  73. if(flag) printf(" %d%c" , i/ , i&?'w':'h');
  74. else printf("%d%c" , i/ , i&?'w':'h');
  75. flag=;
  76. }
  77. }
  78. puts("");
  79. }
  80. }
  81. return ;
  82. }

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

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

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

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

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

  3. poj 3648 2-SAT问题

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

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

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

  5. poj 1687 Buggy Sat 简单计算几何

    暑期集训出的第一道一血 感觉自己萌萌哒…… 这道题本身并没有坑点 仅仅是翻译巨坑…… 解大腿在做B 安学长在做E 我闲着也没事 就一个词一个词翻译F…… 最后感觉…… 题干大多数都看不懂…… 也都没啥 ...

  6. POJ 3648 Wedding

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

  7. poj 3648 2-SAT建图+topsort输出结果

    其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题.要注意的是在topsort输出结果的时候,缩点后建图需要反向连边, ...

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

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

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

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

随机推荐

  1. Android ViewFlipper的使用分析

    [ViewFlipper]——基础 1.ViewPager 和ViewFliping的区别: 最显著的区别就是ViewPager在滑动的时候内部的View默认就能够跟随手指滑动,而 ViewFlipi ...

  2. eclipse不能打断点的问题

    今天突然eclipse不能打断点了,按ctrl+左键也不能进行方法导向了.查了很多资料还是不清楚怎么回事. 我把原来的文件再重新复制下,这个副本竟然是正常的. 结论:把原来的文件重新编译生成class ...

  3. 转:为什么C++中空类和空结构体大小为1?

    参考:http://www.spongeliu.com/260.html 为什么C++中空类和空结构体大小为1? On November 17, 2010, in C语言, 语言学习, by spon ...

  4. codeblock报__objc_class_name_xxx问题

    添加来一个class文件,在其他文件调用时,报下面这个错误: undefined reference to `__objc_class_name_Test' 右击Test这个类的文件弹出Propert ...

  5. 转!!MYSQL数据类型

    这篇文章主要介绍了MySQL数据类型和常用字段属性总结,本文总结了日期和时间数据类型.数值数据类型.字符串数据类型等,需要的朋友可以参考下     前言 好比C++中,定义int类型需要多少字节,定义 ...

  6. C# Web中Session的使用

    1. 关于使用之前要注意的: 在使用session之前,一定要注意继承自System.Web.UI.Page,或在使用session时加上System.Web.HttpContext.Current: ...

  7. requestAnimationFrame兼容性扩展

    /** * requestAnimationFrame兼容性扩展,两方面工作: * 1.把各浏览器前缀进行统一 * 2.在浏览器没有requestAnimationFrame方法时将其指向setTim ...

  8. Unity5.1 新的网络引擎UNET(二) UNET 官方推荐Demo案例

    http://blog.csdn.net/u010019717/article/details/46873153 视频 http://www.iqiyi.com/playlist391685502.h ...

  9. Linux下安装最新的Eclipse

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  10. Scrum项目3.0

    1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3. 确定Sprint目标. 3.1 产品负责人概括产 ...