POJ PKU 3648 2-SAT之四
(2010-07-30 23:11:39)
标签:
pojpku36482-satit |
分类: 图论 |
poj 六道2-sat第四题:
题目描述:
一堆夫妇去参加一对新人的婚礼。人们坐在一个很长很长的桌子的两侧(面对面)。新郎新娘在桌子头面对面座。
新娘不希望看见她对面的一排有一对夫妇坐着(夫妇需要分开两排座)。
同时,一些人之间有暧昧关系,新娘也不希望有暧昧关系的人同时坐在她对面的一排。
问你可否满足新娘的要求,可以的话,输出一种方案。
解题报告:
首先,每个人都可能坐在桌子两侧的某一侧,这样,把每个人拆成两个点。
第一个点表示桌子左侧(我自己定义的),第二个表示右侧。即i和i’
新娘我让她坐在左侧,新郎坐在右侧。
新娘编号0,加入边i’-》i,就是说如果新娘坐右侧的话,就需要坐到左侧(这样就限定了新娘坐在左侧),新郎同样处理。
夫妇一定一左侧,一右侧。
有暧昧关系的人要么同时坐在左侧(不让新娘看见),要么一个坐在左侧,一个坐在右侧。
这样图就建好了。
剩下的就是套用2-sat算法了。
代码如下:
#include<iostream>
using namespace std;
#define size 200 //
点的个数
#define esize 10000 //
边的个数
int v[size],
cnt, v2[size],
cnt2;
struct edge{int
from, to, next;}e[esize],
e2[esize];
void insert(int
from, int to)
{
}
void insert2(int
from, int to)
{
}
int index, dfn[size],
low[size], instack[size],
sta[size], top;
int belong[size],
cntnum, num[size];
int cf[size],
rd[size], que[size],
col[size];
bool ans[size];//1表示选择
void tarjan(int id)
{
}
bool solve(int n) // n是一半的点数(实际的人数)
执行tarjan和topsort,完成标记
{