twoset模版

twoset基本思想:有n个党派,每个党派有2个人,要求每个党派都要选出一个人,每个人之间可能存在互斥关系,判断最后能否选出这N个人来

const int MAXN=20020;
const int MAXM=100010;

struct Edge
{
    int to,next;
}edge[MAXM];

int head[MAXN],tot;

void init()
{
    tot=0;
    memset(head,-1,sizeof(head));
}

void addedge(int u,int v)
{
    edge[tot].next=head[u];
    edge[tot].to=v;
    head[u]=tot++;
}

bool vis[MAXN];
int S[MAXN],top;

bool dfs(int u)
{
    if(vis[u^1])
        return false;
    if(vis[u])
        return true;
    vis[u]=true;
    S[top++]=u;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        if(!dfs(edge[i].to))
            return false;
    }
    return true;
}

bool Twosat(int n)//这里的n代表一共有n个人,(0,1),(2,3)(4,5)代表同一个党派
{
    memset(vis,false,sizeof(vis));
    for(int i=0;i<n;i+=2)
    {
        if(vis[i]||vis[i^1])
            continue;
        top=0;
        if(!dfs(i))
        {
            while(top)
                vis[S[--top]]=false;
            if(!dfs(i^1))
                return false;
        }
    }
    return true;
}

 

posted @ 2016-08-08 14:46  相儒以沫  阅读(332)  评论(0编辑  收藏  举报