题意:
      一对夫妻结婚,请来了n对夫妻,所有人坐在同一张桌子上吃饭,这张桌子是长方形的可以坐两排人,有如下限制
(1) 新娘和新郎不做同一侧。
(2) 每对来的夫妻也不能坐在同一侧。 
(3) 有一些人有暧昧关系(男女,男男,或者女女),有暧昧关系的两

个人不可以同时坐在新娘对面。


输出一组可行解,输出的是坐在新娘对面的人。

思路:

     根据限制关系,而且还是二选一,显然这个是2sat,对于每个人,都拆成两个点,一个是a表示坐在新娘这一侧,另一个是~a表示坐在新郎这一侧,则对于任何有暧昧关系的,要么一边坐一个,要不同时坐在新娘这一侧,则只要他们两个中至少有一个1就行了,建图是这样 ~a -> b ,~b -> a,对于每一对,他们不能坐在同一侧则不能相同,建图是 a -> ~b ,b -> ~a ,~a ->b ,~b -> a ,还有就是新娘必须坐在新娘这侧,直接 ~a -> a.


#include<stdio.h>
#include<string.h>
#include<stack>#define N_node 5000
#define N_edge 100000
#define R 1
#define B 2using namespace std;typedef struct
{int to ,next;
}STAR;STAR E1[N_edge] ,E2[N_edge];
int list1[N_node] ,list2[N_node] ,tot;
int Belong[N_node] ,cnt;
int mark[N_node] ,Col[N_node];
stack<int>st ,stt;void add(int a ,int b)
{E1[++tot].to = b;E1[tot].next = list1[a];list1[a] = tot;E2[tot].to = a;E2[tot].next = list2[b];list2[b] = tot;
}void DFS1(int s)
{mark[s] = 1;for(int k = list1[s] ;k ;k = E1[k].next)if(!mark[E1[k].to]) DFS1(E1[k].to);st.push(s) ,stt.push(s);
}void DFS2(int s)
{mark[s] = 1;Belong[s] = cnt;for(int k = list2[s] ;k ;k = E2[k].next)if(!mark[E2[k].to]) DFS2(E2[k].to);
}bool solve(int n)
{memset(mark ,0 ,sizeof(mark));while(!st.empty()) st.pop();while(!stt.empty()) stt.pop();for(int i = 0 ;i < 4 * n ;i ++)if(!mark[i]) DFS1(i);memset(mark ,0 ,sizeof(mark)) ,cnt = 0;while(!st.empty()){int xin = st.top();st.pop();if(mark[xin]) continue;cnt ++;DFS2(xin);}for(int i = 0 ;i < n * 4 ;i += 2)if(Belong[i] == Belong[i^1]) return 0;return 1;
}int main ()
{int i ,n ,m ,a ,b;char c1 ,c2;while(~scanf("%d %d" ,&n ,&m) && n + m){memset(list1 ,0 ,sizeof(list1));memset(list2 ,0 ,sizeof(list2)) ,tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d%c%d%c" ,&a ,&c1 ,&b ,&c2);a = a * 2 + (c1 == 'h' ? 1 : 0);b = b * 2 + (c2 == 'h' ? 1 : 0);add(a * 2 + 1 ,b * 2);add(b * 2 + 1 ,a * 2);} for(i = 0 ;i < n ;i ++){a = i * 2 ,b = i * 2 + 1;add(a * 2 + 1 ,b * 2) ,add(b * 2 + 1 ,a * 2);add(a * 2 ,b * 2 + 1) ,add(b * 2 ,a * 2 + 1);}add(1 ,0);if(!solve(n)){printf("bad luck\n");continue;}memset(Col ,0 ,sizeof(Col));while(!stt.empty()){i = stt.top() ,stt.pop();if(Col[i]) continue;Col[i] = B ,Col[i^1] = R;}int mk = 0;for(i = 4 ;i < n * 4 ;i += 2){       if(Col[i] == B) continue;if(mk) printf(" ");mk = 1;printf("%d" ,i / 4);i % 4 > 1 ? printf("h") : printf("w");}puts("");}return 0;
}

poj3648 2-sat 输出任意一组解相关推荐

  1. linux文件属性及 ls -l 命令输出结果详解

    目录 一.ls -l 输出的内容概略 二.ls -l 输出内容详解 1.命令 2.inode索引节点编号 3.文件类型 4.文件属性 5.目录或链接的个数 6.所有者及组 7.文件大小 8.文件最后修 ...

  2. python中文编码-python中文编码与json中文输出问题详解

    前言 python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 ...

  3. Illumina输出文件详解

    Illumina输出文件详解 Illumina测序原理(next-seq-550) 基本过程 基本概念 BCL文件(Base Call Files) BCI文件(Base Call Index Fil ...

  4. 单片机_PWM输出原理详解

    单片机_PWM输出原理详解 理论篇   博主自己的经历告诉我,PWM波的理解和应用确实还是挺重要的,这里专门花一期详细介绍一下 什么是PWM?   PWM,英文名Pulse Width Modulat ...

  5. python语言格式化输出_Python format()格式化输出方法详解

    原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...

  6. 输出任意一元二次函数的结果值

    输出任意一元二次函数的结果值: 一.学习要点: 1.函数可以作为一个函数的返回值,叫做返回函数. 参见:https://www.liaoxuefeng.com/wiki/001374738125095 ...

  7. Snort日志输出插件详解

    Snort日志输出插件详解 Snort是一款老×××的开源***检测工具,本文主要讨论他作为日志分析时的各种插件的应用.Snort的日志一般位于:/var/log/snort/目录下.可以通过修改配置 ...

  8. unix/linux命令“ls -l”选项输出结果详解

    from: http://hi.baidu.com/hoxily/item/12e2a02d03f77e0942634a8e unix/linux命令"ls -l"选项输出结果详解 ...

  9. 黑马程序员---java算法实现输出任意奇数维数独

    java算法实现输出任意奇数维数独 ----------- android培训.java培训.java学习型技术博客.期待与您交流! ----------- /** 该类可以打印任意维数数独,但是必须 ...

最新文章

  1. Window环境下配置MySQL 5.6的主从复制、备份恢复
  2. 读取网络数据缓存在本地 流程图
  3. [Java网络编程基础]InetAddress的使用
  4. 来几个FUNNY PICS,让大家笑一笑!
  5. raspberry pi_探索Raspberry Pi Sense HAT
  6. python零基础能学吗-初学者必知:零基础学习Python真的能学会吗?
  7. Angularjs1培训
  8. mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting
  9. 洛谷oj——P1316 丢瓶盖【二分】
  10. vdbench安装及使用
  11. sigmoid函数特性
  12. ftp红帽子 linux,红帽linux安装FTP服务
  13. tekla钢结构算量_钢结构、Tekla及建筑工业化厂商对Tekla软件的开发和应用
  14. vue css 实现选中div 边框变色,右下角三角形
  15. 从产品角度看滴滴事件,滴滴顺风车业务存在的问题
  16. 【IDEA双击快捷方式无法打开】
  17. thrift 编译报错 undefined reference
  18. 某汽车零部件制造厂商
  19. 为什么选择IT行业,原因是什么
  20. PhotonServer简介(Yanlz+Unity+Photon+PUN+BOLT+UNet+KBEngine+立钻哥哥+CCU+MMO+WWW+==)

热门文章

  1. XenDesktop7-基于SCVMM2012SP1的部署
  2. 云接口给中小企业带来的帮助
  3. 且看微软的.Net和Sun公司的J2EE如何对垒
  4. WinForm 里面ListBox的问题
  5. 使用postman模拟登录请求
  6. 《Algorithm算法》笔记:元素排序(2)——希尔排序
  7. Xmpp实现简单聊天系列 --- ②用户注册和登陆
  8. 郑州5月份的windows phone7小聚
  9. [Win32]一个调试器的实现(六)显示源代码
  10. Gitblit用户没有push权限,但是已经在team里面配置了