POJ 3648 Wedding(2-SAT+输出方案)

阅读更多

【题目链接】

http://poj.org/problem?id=3648


【题目大意】

有n-1对夫妇被一对新郎新娘邀请来参加婚礼,他们要坐在一条长桌上,可以选择坐在左边或者右边。每对夫妻都不能坐在同一边,他们只能是面对面坐着。

但是这些人中有JQ,共有m对有JQ(新郎也可能有奸情,可怜的新娘...)。要求这些JQ对不能同时坐在新娘的对面。即,每一对JQ者,他们可以同时坐在和新娘同一边,也可以一个和新娘同一边而另一个在新娘对面即可。

要求找到一种方案并输出,如果没有方案输出bad luck


【思路】

对于每一对夫妇,有两种选择,要么女方和新娘同一边,要么男方和新娘坐在同一边。

然后是根据JQ关系加边。



【代码】

#include 
#include
#include
#include
#include
#define WHITE -1
#define RED  1
#define BLUE 0
using namespace std;

typedef long long int64;

const int MAXN = 50;
const int VN = MAXN*2;
const int EN = VN*VN;

int n, m;

struct Edge{
    int u, v, next; 
};

struct Graph{
    int size, head[VN];
    Edge E[EN];
    void init(){size=0; memset(head, -1, sizeof(head));};
    void addEdge(int u, int v){
        E[size].u = u; E[size].v = v;
        E[size].next = head[u];
        head[u] = size++;
    }
}g, g1;

class Two_Sat{
public:
    bool check(const Graph&g, const int n){
        scc(g, 2*n);
        for(int i=0; ique;
        memset(color, WHITE, sizeof(color));
        for(int i=1; i<=bcnt; ++i)
            if(!indeg[i])
                que.push(i);

        while(!que.empty()){
            int u = que.front(); 
            que.pop();
            if(color[u] != WHITE) continue;
            color[u] = RED;
            color[opp[u]] = BLUE;

            for(int e=g1.head[u]; e!=-1; e=g1.E[e].next){
                int v = g1.E[e].v;
                if(--indeg[v] == 0){
                    que.push(v);
                }
            }
        }

        // 输出方案
        printf("1%c",color[belong[1]]==RED?'w':'h');
        for(int i=2; i 
 

你可能感兴趣的:(POJ 3648 Wedding(2-SAT+输出方案))