首頁 >資料庫 >mysql教程 >POJ 3905 Perfect Election(简单2

POJ 3905 Perfect Election(简单2

WBOY
WBOY原創
2016-06-07 15:48:36919瀏覽

POJ 3905 Perfect Election(简单2-SAT) http://poj.org/problem?id=3905 题意: 这里有1到N个人正在进行议员选举,每个人有2种结果,选上(0),未选上(1).现在的问题是,有M个选民的议员,结果必须符合这M条意愿,问你是否存在这种选举结果. 分析: 由于每条意愿都是

POJ 3905 Perfect Election(简单2-SAT)

http://poj.org/problem?id=3905

题意:

        这里有1到N个人正在进行议员选举,每个人有2种结果,选上(0),未选上(1).现在的问题是,有M个选民的议员,结果必须符合这M条意愿,问你是否存在这种选举结果.

分析:

        由于每条意愿都是或的关系.则直接用2-sat添加对应边即可.

        简单2-SAT问题,注意把候选人序号改成0到N-1即可.

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1000+10;
struct TwoSAT
{
    int n;
    vector<int> G[maxn*2];
    int S[maxn*2],c;
    bool mark[maxn*2];

    bool dfs(int x)
    {
        if(mark[x^1]) return false;
        if(mark[x]) return true;
        mark[x]= true;
        S[c++]=x;

        for(int i=0;i<g if return false true void init n this->n=n;
        for(int i=0;i<n g memset void add_clause x xval y yval bool solve for i="0;i<2*n;i+=2)" if c="0;" while>0) mark[S[--c]]=false;
                if(!dfs(i+1)) return false;
            }
        }
        return true;
    }
}TS;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        TS.init(n);
        for(int i=0;i<m int a scanf ts.add_clause printf return><br>
<br>


</m></n></g></int></vector></algorithm></cstring></cstdio>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn