POJ 3648 2SAT求解方案

题意:有个新娘和新郎,然后请了n-1对夫妇,其中有m对有不正当关系……而新娘不想看到有不正当关系的在一起,新娘可以看到在她对面的人,而在她同一边的看不到,所以即使有不正当关系的在新娘同一边也是可以的。问:有没有可能的方案符合题意?

这题看了一天了……还是没弄明白其建图是什么回事……唉……看了魏神的博客,然后还是研究了好久,不知道为什么那样建图,晕……等过段时间再回来看再理解吧!

就把这个作为2SAT求解方案的模板咯,嘿嘿……

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define sc(a,b) scanf("%d%d",&a,&b)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 1000005
#define MN 100050
#define INF 1000000009
#define eps 1e-7
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
int DFN[MN],LOW[MN],vis[MN],belong[MN];
int n,m,index,Count,conflict[MN],color[MN],id[MN];
stackStack,q;
vectore[MN],ee[MN]; //e为原图,ee为新图
void init()
{
    index=Count=0;
    mem(vis,0); mem(DFN,0); mem(LOW,0); mem(belong,0);
    mem(conflict,0); mem(color,0); mem(id,0);
    for(int i=0;i<=2*n;i++) e[i].clear(),ee[i].clear();
    while(!Stack.empty()) Stack.pop();
}
void tarjan(int u)
{
    DFN[u]=LOW[u]=++index;
    vis[u]=1;
    Stack.push(u);
    int v,i,l=e[u].size();
    for(i=0;i


你可能感兴趣的:(POJ 3648 2SAT求解方案)