POJ PKU 3683 2-SAT之三
(2010-07-30 19:19:16)
标签:
pojpku36832-satit |
分类: 图论 |
poj 六道2-sat第三题:
题目描述:有n个婚礼,每个婚礼有起始时间si,结束时间ti,还有一个主持时间ti,ti必须安排在婚礼的开始或者结束,主持由祭祀来做,但是只有一个祭祀,所以各个婚礼的主持时间不能重复,问你有没有可能正常的安排主持时间,不能输出no,能的话要输出具体的答案:即每个婚礼的主持时间段是什么样的。
解题报告:
对于每个婚礼,主持时间只有两种状态,而且各个婚礼之间的主持时间之间有相互限制,所以想到2-sat。
构图:
对于婚礼i和婚礼j。i表示在开始主持,i2表示在结束主持,j类似。
枚举每一对不同的i和j。
如果i和j冲突。连接i j2
如果i和j2冲突,连接i j
如果i2和j冲突,连接i2 j2
如果i2和j2冲突,连接i2 j
然后就是求强联通,topsort,输出答案。
代码如下:
#include<iostream>
using namespace std;
#define size 2100 // 点的个数
#define esize 3000000 // 边的个数
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,完成标记
{