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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 100;
const int maxm = 1000;
struct node{
int v,next;
}edge[maxm];
int res[maxm][2],head[maxn],low[maxn],dfn[maxn],stack[maxn],in[maxn],fa[maxn],ha[maxn];
int color[maxn];
int n,m,Time,top,scc_cnt,id;
vector<int>DAG[maxn];
queue<int>que;
void add_edge(int u,int v){
edge[id].v = v;edge[id].next = head[u]; head[u] = id++;
}
void init(){
memset(head,-1,sizeof(head));
memset(in,0,sizeof(in));
memset(dfn,0,sizeof(dfn));
memset(fa,0,sizeof(fa));
id = 0;
int i; int u,v;
char ch1,ch2; for(i = 0; i < m; i++){
scanf("%d%c %d%c",&u,&ch1,&v,&ch2);
u <<= 1;v <<= 1;
if(ch1 == 'w')u ^= 1;
if(ch2 == 'w')v ^= 1;
//必须在一起的连边
add_edge(u^1,v);
add_edge(v^1,u);
}
//这条边必须要加
add_edge(0,1);
}
int min(int x,int y){
return x < y ? x : y;
}
void tarjan(int u){//求强连通分量并缩点
dfn[u] = low[u] = ++Time;
stack[top++] = u;in[u] = 1;
for(int id = head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[v],low[u]);
}
else if(in[v])low[u] = min(low[u],dfn[v]);
}
if( dfn[u] == low[u]){
scc_cnt++;
do{
int v = stack[--top];
fa[v] = scc_cnt;
in[v] = 0;
}while(u != stack[top]);
}
}
void topsort(){//拓扑排序并着色
memset(color,0,sizeof(color));
while(!que.empty()){
int u = que.front();
que.pop();
if(!color[u])color[u] = 1,color[ha[u]] = 2;
for(int i = 0; i < DAG[u].size(); i++){
int v = DAG[u][i];
in[v]--;
if(!in[v])que.push(v);
}
}
}
int main(){
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m),n||m){
init();
Time = top = scc_cnt = 0;
int i;
for( i = 0; i < 2*n; i++)
if(!dfn[i])tarjan(i);
for(i = 0; i < n; i ++)//夫妻不能做在同一边
if(fa[i*2] == fa[i*2+1])break;
else {
ha[fa[i*2]] = fa[i*2+1];ha[fa[i*2+1]] = fa[i*2];
}
if( i < n){
puts("bad luck");
continue;
}
memset(in,0,sizeof(in));
for( i = 1; i <= scc_cnt; i++)DAG[i].clear();
//建反序拓扑图
for(int u = 0; u < n*2; u++){
for( id = head[u] ; id != -1; id = edge[id].next){
int v = edge[id].v;
if( fa[u] != fa[v]){
DAG[fa[v]].push_back(fa[u]);in[fa[u]]++;
}
}
}
while(!que.empty())que.pop();
for( i = 1 ; i <= scc_cnt; i++)
if(!in[i])que.push(i);
topsort();
//输出
for(i = 2; i < 2*n; i += 2){ if(i!=2)printf(" ");
if(color[fa[i]] == color[fa[0]] )printf("%dw",i/2);
else printf("%dh",i/2);
}
puts("");
}
return 0;
}

  

UVA 11294 wedding 2-sat的更多相关文章

  1. UVA 11294 - Wedding(Two-Set)

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

  2. UVA 11294 Wedding

    给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘.同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面. 这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的. 分析: 首先说 ...

  3. UVA 11294 Wedding(2-sat)

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

  4. UVa 11294 Wedding (TwoSat)

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

  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. 【linux日志】【日志分析】linux系统各日志文件的含义

    前段时间太忙,没有来得及管博客,最近时间充裕了,开始更新博客. 因为最近在看linux日志相关内容,把心得分享给大家 linux系统日志文件默认存放路径/var/log/ ls查看此路径下有哪些日志文 ...

  2. light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)

    题目链接 大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的), ...

  3. 一道看似简单的go程序的深入分析

    先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...

  4. 图解Redis之数据结构篇——压缩列表

    前言     同整数集合一样压缩列表也不是基础数据结构,而是 Redis 自己设计的一种数据存储结构.它有点儿类似数组,通过一片连续的内存空间,来存储数据.不过,它跟数组不同的一点是,它允许存储的数据 ...

  5. ABP实现EF执行SQL(增删改查)解决方案

    前言 一般情况下,使用EF中的语法可以帮助我们完成绝大部分业务,但是也有特殊的情况需要直接执行的Sql语句.比如,我们的业务过于复杂繁琐,或是有些业务使用EF操作时比较复杂,但是使用的Sql时会很简单 ...

  6. Activiti6系列(4)- 三个war包的数据源及密码修改

    一.activiti-app修改数据源和密码 1.使用sublimetext工具打开tomcat,方便进行配置文件的修改. 找到被解压的war包,activiti-app/WEB-INF/classe ...

  7. Leetcode solution 227: Basic Calculator II

    Problem Statement Implement a basic calculator to evaluate a simple expression string. The expressio ...

  8. 【0726 | Day 2】编程语言分类/主流编程语言介绍/网络的瓶颈效应

    编程语言分类 机器语言 与硬件交互 优点:执行效率高 缺点:开发效率低 汇编语言 间接与硬件交互 优点(相较于机器语言):开发效率高 缺点(相较于机器语言):执行效率低 高级语言 简单化指令,让人人都 ...

  9. 谈谈我对Ext的认识,元芳,你怎么看

    实用Ext第一步当然是引用jar包啦. 下载地址 在页面上加上div用于显示这也是必须的 <div id='loginpanel' ></div> 在js中我们肯定需要将Ext ...

  10. 用xshell链接虚拟机上的linux

    [步骤]一.安装VMware直接点击下一步即可 二.安装linux下载CentOS,在VMware中安装,这个网上有很多教程,这里就不赘述了. 三.配置要想连接上xshell,需要配置IP,将Linu ...