POJ-3648:Wedding (2-SAT)

 

题目大意:

有一对新娘新郎要准备婚礼,邀请了n-1对夫妇,有一对长桌,新娘和新郎首先坐在长桌的两侧。

其次对于每对夫妇有如下要求,即丈夫和妻子不能坐在同一侧。

其次其中m对夫妇有通奸关系,有通奸关系的不能同时坐在新娘的对面(可以同性),

求新娘这边一种合理的座位方式。

 

题目解析:

典型2-SAT问题,从每对夫妇中选择一个人坐在其中一侧。其中有一些约束条件,

但是这题有一个坑点就是新娘也可能有奸情。所以我们选择新郎一侧的人,输出的时候换一侧输出即可。

 

Ac代码:

#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int INF=1e9+7;

int n,m;
vector v[maxn],r[maxn];
vector< pair > ans;

int tot,cnt,low[maxn],dfn[maxn],belong[maxn];
bool vis[maxn];
stack s;
void tarjan(int u)
{
    low[u]=dfn[u]=++tot;
    s.push(u),vis[u]=1;
    for(int i=0;i que;
    for(int i=1;i<=cnt;i++)
        if(sl[i]==0) que.push(i);
    while(!que.empty())
    {
        int now=que.front();
        que.pop();
        if(color[now]==-1)
        {
            color[now]=1;
            color[opp[now]]=0;
            dfs(opp[now]);
        }
        for(int i=0;i

 

 

你可能感兴趣的:(图论---2-SAT)