#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100+5;
struct TwoSAT{
int n;
vector<int> G[maxn*2];
bool mark[maxn*2];
int s[maxn*2],c;
bool dfs(int x){
if(mark[x^1]) return false;
if(mark[x]) return true;
mark[x]=true;
s[c++]=x;
for(int i=0;i<G[x].size();i++)
if(!dfs(G[x][i])) return false;
return true;
}
void init(int n){
this->n=n;
for(int i=0;i<2*n;i++) G[i].clear();
memset(mark,0,sizeof(mark));
}
void add_clause(int x,int xval,int y,int yval){
x=x*2+xval;
y=y*2+yval;
G[x^1].push_back(y);
G[y^1].push_back(x);
}
bool solve(){
for(int i=0;i<2*n;i+=2){
if(!mark[i]&&!mark[i+1]){
c=0;
if(!dfs(i)){
while(c) mark[s[--c]]=false;
if(!dfs(i+1)) return false;
}
}
}
return true;
}
};
TwoSAT solver;
int n,m;
int main()
{
while(scanf("%d%d",&n,&m)&&(n+m))
{
solver.init(2*n);
solver.mark[1]=true;//确定妻子是坐右边
for(int i=0;i<n;i++){
solver.add_clause(2*i,1,2*i+1,1);//新郎新娘不能同时坐右边
solver.add_clause(2*i,0,2*i+1,0);//左边
}
for(int i=0;i<m;i++){
char cmd1[2],cmd2[2];
int u,v;
scanf("%d%s%d%s",&u,cmd1,&v,cmd2);
int x=2*u+(cmd1[0]=='h'?1:0);
int y=2*v+(cmd2[0]=='h'?1:0);
solver.add_clause(x,1,y,1);//吵过架的人不能坐同一边
}
if(!solver.solve()) printf("bad luck\n");
else{
for(int i = 2;i < 2*(n-1);i+=2){
printf("%d",i/2);
if(solver.mark[2*i+1]) printf("w ");
else printf("h ");
}
printf("%d",n-1);
if(solver.mark[2*2*(n-1)+1]) printf("w\n");
else printf("h\n");
}
}
return 0;
}
UVA 11294 Wedding(2-sat)
最新推荐文章于 2019-10-01 10:52:08 发布