POJ 3207 Ikki's Story IV – Panda's Trick (2-SAT)

POJ 3207 Ikki's Story IV – Panda's Trick (2-SAT)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

职务地址:找好矛盾关系。矛盾关系是(2,5)和(3,6)这两个仅仅能一个在外边,一个在里边。利用这个矛盾关系来建图。

能够用在外边和里边来当1和0,最后推断每对是否出现矛盾。

代码例如以下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
const int INF=0x3f3f3f3f;
int head[1100], cnt, top, ans, index;
int dfn[1100], low[1100], instack[1100], stak[1100], belong[1100];
struct node
{
    int u, v, next;
}edge[1000000];
struct N
{
    int l, r;
}xian[10000];
void add(int u, int v)
{
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int pan(N x, N y)
{
    if((x.l>y.l&&x.l<y.r&&x.r>y.r)||(x.r>y.l&&x.r<y.r&&x.l<y.l))
        return 1;
    return 0;
}
void tarjan(int u)
{
    dfn[u]=low[u]=++index;
    instack[u]=1;
    stak[++top]=u;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(instack[v])
        {
            low[u]=min(dfn[v],low[u]);
        }
    }
    if(dfn[u]==low[u])
    {
        ans++;
        while(1)
        {
            int v=stak[top--];
            instack[v]=0;
            belong[v]=ans;
            if(u==v) break;
        }
    }
}
void init()
{
    memset(head,-1,sizeof(head));
    cnt=top=ans=index=0;
    memset(dfn,0,sizeof(dfn));
    memset(instack,0,sizeof(instack));
}
int main()
{
    int n, m, i, j;
    scanf("%d%d",&n,&m);
    init();
    for(i=0;i<m;i++)
    {
        scanf("%d%d",&xian[i].l,&xian[i].r);
        if(xian[i].l>xian[i].r) swap(xian[i].l,xian[i].r);
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<i;j++)
        {
            if(pan(xian[i],xian[j]))
            {
                add(i<<1,j<<1|1);
                add(j<<1,i<<1|1);
                add(i<<1|1,j<<1);
                add(j<<1|1,i<<1);
                //printf("%d %d\n%d %d\n",i<<1,j<<1|1,j<<1,i<<1|1);
            }
        }
    }
    for(i=0;i<2*m;i++)
    {
        if(!dfn[i])
            tarjan(i);
    }
    int flag=0;
    for(i=0;i<m;i++)
    {
        if(belong[i<<1]==belong[i<<1|1])
        {
            flag=1;
            //printf("%d\n",i);
            break;
        }
    }
    if(flag) puts("the evil panda is lying again");
    else
        puts("panda is telling the truth...");
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117134.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpEL 表达式_strpbrk函数

    SpEL 表达式_strpbrk函数前言:Spring表达式语言(简称SpEL)是一种与JSP2的EL功能类似的表达式语言,它可以在运行时查询和操作对象图。与JSP2的EL相比,SpEL功能更加强大,它甚至支持方法调用和基本字符串模板函数。SpEL可以独立于Spring容器使用——只是当成简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring的Bean配置。注:在…

    2022年9月12日
    4
  • tableau新手教程_什么是tableau

    tableau新手教程_什么是tableautableau教程快速入门先基础了解你的数据先选数据源了解你的数据源字段含义、字段类型数据更新频率、数据量、波动频率范围决定了你的时间颗粒度例子:页面转化率(约小时级别+日级别)财

    2022年8月1日
    4
  • 小米nfc模拟加密门禁卡详细图文教程(实测可用)—————– IC ID CUID卡区别

    小米nfc模拟加密门禁卡详细图文教程(实测可用)—————– IC ID CUID卡区别现在小区虽然都加装了智能门,可以通过手机NFC功能开启或者使用钥匙开启,但是有些用户并不知道原来手机是可以当钥匙使用的。今天我们来学习使用小米nfc模拟加密门禁卡,这样手机就可以变成一把钥匙了。以下是小米nfc模拟加密门禁卡步骤。1、非加密卡直接使用小米钱包的门卡模拟功能即可,如果能直接模拟的就不是加密卡。2、NFC手机支持的频段一般为13.56Mhz卡片,如果是其他门禁卡,手机贴上根本没反应的不可以模拟。3、只能模拟卡片的ID,不支持储值消费等功能。部分门禁等系统只认证卡片ID,所以有可能通过

    2022年5月4日
    256
  • JS进阶(1) —— 人人都能懂的构造函数

    JS进阶(1) —— 人人都能懂的构造函数

    2022年3月13日
    40
  • Ubuntu下安装eclipse

    Ubuntu下安装eclipse

    2021年12月2日
    41
  • 新浪股票接口获取历史数据

    新浪股票接口获取历史数据这两天做了一个调用新浪股票接口获取实时以及历史股票数据的应用,因为新浪没有公开关于其接口的官方文档,所以通过各种百度差了很多关于新浪股票接口的使用,不过大家基本都是转载或者直接复制,对于实时数据的获取讲的很详细,但是缺少获取历史数据的方法。关于实时数据的获取大家可以看这篇博客:实时股票数据接口 经过不懈的努力终于再这篇博文中找到了关于新浪股票历史数据的获取方式腾讯股票接口、和讯网股票接口、新浪股票…

    2022年6月24日
    115

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号