算法:POJ 3207 Ikki's Story IV

【题目大意】

一个圆圈上有N个数:0,1,2……N-1。 然后有m条线两两连接这些点,这些线可 以在圆圈里面,也可以在圆圈外面。问有没有一种方式,使得这些线都不相交。

【思路】

以 线为单位,每条线要么在圆圈里面,要么在圆圈外面,典型的2-SAT模型。

【代码】

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

typedef long long int64;  

const int MAXN = 1010;
const int VN   = MAXN*2;
const int EN   = VN*VN/2;
int n, m;
int arr[VN][2];  

struct Graph{
    int size;
    int head[VN];
    struct{
        int v, next;
    }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, 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;
        DFN[u] = low[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){
        idx = top = bcnt = 0;
        memset(DFN, -1, sizeof(DFN));
        memset(instack, 0, sizeof(instack));
        for(int i=0; i<2*n; ++i)
            if(DFN[i] == -1)
                tarjan(g, i);
    }
private:
    int idx, top, bcnt;
    int DFN[VN];
    int low[VN];
    int sta[VN];
    int belong[VN];
    bool instack[VN];  

}sat;  

bool isCross(int* A, int *B){
    return  A[0]>B[0]&&A[0]<B[1] && (A[1]<B[0] || A[1]>B[1])
         || A[1]>B[0]&&A[1]<B[1] && (A[0]<B[0] || A[0]>B[1]);
}  

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

        g.init();
        for(int i=0; i<n; ++i){
            scanf("%d%d", &arr[i][0], &arr[i][1]);
            if(arr[i][0] > arr[i][1]) swap(arr[i][0], arr[i][1]);
        }  

        for(int i=0; i<n; ++i){
            for(int j=i+1; j<n; ++j){
                if(isCross(arr[i], arr[j])) {
                    g.addEdge(i, j+n);
                    g.addEdge(i+n, j);
                    g.addEdge(j, i+n);
                    g.addEdge(j+n, i);
                }
            }
        }
        if(sat.check(g, n)) puts("panda is telling the truth...");
        else puts("the evil panda is lying again");  

    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, include
, const
, head
, size
圆圈
marty s story、gelei s story、what s your story、the invalids story、tfamily s story,以便于您获取更多的相关知识。

时间: 2024-12-02 00:27:31

算法:POJ 3207 Ikki's Story IV的相关文章

.NET中的加密类(对称加密)

 对象层次结构     .NET Framework 安全系统实现可扩展模式的派生类继承.层次结构如下所示:      算法类型类,例如 SymmetricAlgorithm 或 HashAlgorithm.该级别为抽象.      从算法类型类继承的算法类,例如 RC2 或 SHA1.该级别为抽象.      从算法类继承的算法类的实现,例如 RC2CryptoServiceProvider 或 SHA1Managed.该级别是完全实现的.      使用这种模式的派生类,很容易添加新算法或现

请教:C#实现的AES加密,如何用java实现!

问题描述 下面这段是用C#做的AES加密,请教各位大神如何用java实现,谢谢!usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Text;usingSystem.Security.Cryptography;namespaceAES加密解密{///<summary>///AES加密解密类///</summ

2010年度最有技术含量攻击:Padding Oracle Attack

本文目的 向非安全方向的技术人员,特别是软件架构师介绍Padding Oracle的基本原理及其危害,以避免无意中在软件设计和技术选型过程里留下安全隐患. Padding Oracle Attack的一些背景资料 这个攻击引起广泛关注是在今年5月的ekoparty安全会议上,两位安全工程师Julinao Rizzo和Thai Duong共同发表了一篇名为Practical Padding Oracle Attacks的论文.由于考虑到这个漏洞的广泛性及攻击可能带来的严重后果,他们的论文中并没有对

算法:poj 1155 TELE (树形背包dp)

题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结 构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从 转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号 的费用总和. 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪 些用户提供信号而不给哪些用户提供信号. 写一个程序找出一个方案使得有线电视网在不亏本的情况 下使观看转播的用户尽可能多. 思路 树形

算法:poj 2749 &amp;amp; hdu 1815 Building roads(2-SAT + 二分,好题)

[题目大意] 有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来. 为了使得任意 牛棚两个都可以有道路联通,现在要让每个牛棚都连接一条路到S1或者S2. 有a对牛棚互相有仇恨, 所以不能让他们的路连接到同一个中转站.还有b对牛棚互相喜欢,所以他们的路必须连到同一个中专站. 道路的长度是两点的曼哈顿距离. 问最小的任意两牛棚间的距离中的最大值是多少? [思路] 两天前看了这题,当时没什么想法,今天又翻看了一下,想出来了. 每个 牛棚有可以选择S1或者S2,并且有矛盾对,是2-SA

算法题之poj 1961 Period(KMP, 最短循环节)

题目链接: POJ  : http://poj.org/problem?id=1961 HDU : http://acm.hdu.edu.cn/showproblem.php?pid=1358 ZOJ   : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2177 题目大意: 给定一个长度为n的字符串s,求它的每个前缀的最短循环节.换句话说,对于每个i (2<=i<=n),求一个最大的整数K>1(如果K存在),使

算法题:poj 3080 Blue Jeans(KMP匹配,枚举子串)

链接: http://poj.org/problem?id=3080 题目大意: 给出m(2<=m<=10)个DNA序列, 求出这m个序列中最长的公共字串.如果有多个相同长度的, 输出字典序最小的. 分析与总结: 依次枚举所有的子串, 然后再看是否在所有序列中都能够匹配.保存下长度最大且字典序最小的序 列. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace st

算法题:poj 2541 Binary Witch(KMP水过,逆序转换)

链接: http://poj.org/problem?id=2541 分析与总结: 做这题估算了下复杂度,觉得无论KMP再怎么快,这题暴力也肯定要超时的. 想了很久也没想出个好办法,于是决定暴力之,但是TLE了....于是就放了几天.之后看了下discuss ,这题的正解应该是状态压缩dp,不过目前我还不懂,跪了. 之后百度发现也可以用KMP水过,虽然是因为数据水才过的,不过这种思路很巧妙,值得借鉴! 直接暴力是枚举字符串的后面13个的字母,然后再用KMP匹配,这样的话,就绪要枚举多次,分别是

poj 1125 Floyd算法

一.题目大意 可以说理解题目比解题难~~明显的多源最短路径,我用的Floyd,Floyd也可以算是dp的一种. 题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时,输入数据结束),然后接下来N行描述第i(1<=i<=N)个经纪人与其他经纪人的关系.每行开头数字M为该行对应的经纪人有多少个经纪人朋友(该节点的出度,可以为0),然后紧接着M对整数,每对整数表示成a,b,则表明该经纪人向第a个经纪人传递信息需要b单位时间(即第i号结点到第a号结点的孤长为b),整张图为有向图,即弧