`
king_tt
  • 浏览: 2249024 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

poj 3905 Perfect Election(2-SAT判断简单)

 
阅读更多

【题目链接】

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


【思路】

2-SAT简单的判断题


【代码】

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;

const int MAXN = 1010;
const int VN   = MAXN*2;
const int EN   = VN*VN*2;

int n, m;

 
struct Edge{
    int v, next;
};

struct Graph{
    int size, head[VN];
    Edge E[EN];
    void init(){size=0; memset(head, -1, sizeof(head)); };
    void addEdge(int u, int v){
        E[size].v = v;
        E[size].next = head[u];
        head[u] = size++;
    }
}g;

class Two_Sat{
public:
    bool check(const Graph& g, const int n){
        scc(g, 2*n);
        for(int i=0; i<n; ++i)
            if(belong[i] == belong[i+n])
                return false;
        return true;
    }
private:
    void tarjan(const Graph& g, const int u){
        int v; 
        low[u] = DFN[u] = ++idx;
        sta[top++] = u;
        instack[u] = true;

        for(int e=g.head[u]; e!=-1; e=g.E[e].next){
            v = g.E[e].v;
            if(DFN[v] == -1){
                tarjan(g, v);
                low[u] = min(low[u], low[v]);
            }else if(instack[v]){
                low[u] = min(low[u], DFN[v]);
            }
        }

        if(DFN[u] == low[u]){
            ++bcnt;
            do{
                v = sta[--top];
                instack[v] = false;
                belong[v]  = bcnt;
            }while(u != v);
        }
    }
    void scc(const Graph& g, const int n){
        bcnt = idx = top = 0;
        memset(DFN, -1, sizeof(DFN));
        memset(instack, 0, sizeof(instack));
        for(int i=0; i<n; ++i)
            if(DFN[i] == -1)
                tarjan(g, i);
    }
private:
    int idx, top, bcnt;
    int DFN[VN], low[VN], belong[VN], sta[VN];
    bool instack[VN];
}sat;

int main(){
    
    int  a, b;
    while(~scanf("%d%d", &n, &m)){

        g.init();
        for(int i=0; i<m; ++i){
            scanf("%d%d", &a, &b);

            if(a>0 && b>0){ // + +
                --a; --b;
                g.addEdge(a+n, b);
                g.addEdge(b+n, a);

            }else if(a>0 && b<0){ // + -
                b = -b;  
                --a; --b;
                g.addEdge(a+n, b+n);
                g.addEdge(b, a);

            }else if(a<0 && b>0){ // - +
                a = -a;
                --a; --b;
                g.addEdge(a, b); 
                g.addEdge(b+n, a+n);

            }else if(a<0 && b<0){// - -
                a = -a; b = -b;
                --a; --b;
                g.addEdge(a, b+n);
                g.addEdge(b, a+n);
            }
        }
        if(sat.check(g, n)) puts("1");
        else puts("0");
    
    }
    return 0;
}


分享到:
评论

相关推荐

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    2. "POJ3253-POJ3253-Fence Repair【STL优先队列】.cpp":这是使用STL中的优先队列数据结构来解决题目的代码。 3. "POJ3253-POJ3253-Fence Repair【朴素思想TLE】.cpp":这个文件可能包含了没有利用优先队列,而是...

    poj 1690 Your-Term-Project.md

    poj 1690 Your-Term-Project.md

    poj 1240 Pre-Post-erous!.md

    poj 1240 Pre-Post-erous!.md

    POJ 分类题目

    ### POJ 分类题目知识点详解 #### 一、基本算法 **1. 枚举** - **定义**:枚举是一种通过尝试所有可能情况来解决问题的方法。 - **示例题目**: - poj1753 - poj2965 - **应用场景**:适用于问题规模较小或解决...

    POJ水题集--50道--增加自信

    POJ水题集-----50道左右-----增加自信啊..

    poj-1028-Web-Navigation.zip_poj

    【标题】"poj-1028-Web-Navigation.zip_poj" 指向的是一个编程竞赛问题,POJ(Programming Online Judge)平台上的第1028题,名为“Web Navigation”。该问题通常涉及到算法设计和实现,可能是为了考察参赛者的编程...

    pku(poj)--2494--Acid Text--java代码

    根据给定的文件信息,我们可以总结出以下关于POJ(PKU)问题2494“Acid Text”以及其Java代码实现的关键知识点: ### 1. POJ(PKU)2494:Acid Text POJ(Peking University Online Judge)是北京大学的一个在线...

    poj(PKU-2314-POJ language

    根据提供的文件信息,我们可以分析出该段代码是用于解决POJ平台上的2314题的一种解决方案,主要涉及到了变量管理、表达式处理等方面。下面将详细解释代码中的关键概念和实现逻辑。 ### 关键概念解析 #### Variable...

    poj多道----acm----解题报告

    2. **构建多边形**:利用读入的顶点坐标,构建一个不自交的闭合多边形。在二维平面上,这可以通过链表或数组来实现,将每个顶点作为链表或数组的一个节点,并保证首尾相连。 3. **判断点灯位置**:检查灯的位置是否...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ1258-Agri-Net【Prim】

    2. 建立一个空集合,将已加入最小生成树的顶点放入其中。 3. 对于图中其他未加入集合的顶点,找出与集合内顶点相连的边中权值最小的一条。 4. 将这条边的未加入顶点加入集合,更新边的最小权值。 5. 重复步骤3到4,...

    poj训练计划.doc

    根据给定的文件信息,我们可以总结出一份详细的IT知识训练计划,主要针对编程竞赛和算法学习,特别是聚焦于POJ(Problem Online Judge)平台上的题目训练。这份计划分为两个阶段,初级阶段和中级阶段,共计涉及了165...

    POJ3292-Semi-prime H-numbers

    【标题】"POJ3292-Semi-prime H-numbers"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个题目主要涉及数论和算法设计,特别是关于半素数(Semi-prime)的概念以及H-...

    POJ2299-Ultra-QuickSort

    【标题】"POJ2299-Ultra-QuickSort"是北京大学在线判题系统POJ上的一道编程题目,其主要涉及的算法是快速排序(Ultra-QuickSort)。快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用...

    西北工业大学-c语言-POJ-题目及答案-第七季.doc

    西北工业大学 C 语言 POJ 题目及答案第七季 该文档提供了西北工业大学 POJ(Programming Online Judge)平台上的 C 语言编程题目及答案,共计 7 题,涵盖了基本数据类型、运算符、控制结构、函数和数组等 C 语言...

    ACM题目分类.txt

    - **描述**:数学算法涉及各种数学技巧,如高精度计算、素数判断等。 - **应用场景**:解决数学问题、计算问题等。 - **相关题目**: - POJ 1068 - POJ 2632 - POJ 1573 - POJ 2993 - POJ 2996 ### 图论算法 ...

    poj题目代码

    2. poj_1013.c - "Divisors":此题主要考察了数论和数组处理,要求找出一个数的所有因子,对理解因数分解和遍历数组技巧有帮助。 3. poj_1833.c - "Tic Tac Toe":这是关于井字游戏的实现,涉及到博弈论和回溯算法...

    POJ2002-Squares

    2. "POJ2002-Squares.doc":这可能是一个Microsoft Word文档,包含了详细的解题报告,可能包括问题分析、算法描述、解题步骤、运行结果和可能的优化措施等。 详细说明: 在"POJ2002-Squares"这个问题中,参赛者可能...

    POJ 1150 The Last Non-zero Digit解题报告

    业余爱好。所以,算法不一定好,CODING也不一定佳,效率不一定高,只是能通过online judge而已。

    POJ1002-487-3279【Hash+Qsort】

    2. "POJ1002-487-3279【Qsort】.cpp":这个可能是单独实现快速排序部分的代码,可能用于比较不同的排序方法或作为哈希+快速排序方案的一部分。 3. "POJ1002-487-3279.doc":这是一个文档文件,很可能包含了详细的...

Global site tag (gtag.js) - Google Analytics