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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA课程设计——飞机大战(个人)

    JAVA课程设计——飞机大战(个人)

    2021年10月6日
  • 二进制小数转十进制方法_小数进制转换

    二进制小数转十进制方法_小数进制转换知识点一:一个数的负次方即为这个数的正次方的倒数。方法一、转换分数法参考文章:https://jingyan.baidu.com/article/597a0643614568312b5243c0.html参考文章:https://zhidao.baidu.com/question/1308562360873359899.html举例:将二进制0.1111转换成十进制数二进制…

    2022年9月16日
  • StringBuffer 详解 (String系列之3)[通俗易懂]

    StringBuffer 详解 (String系列之3)[通俗易懂]本章介绍StringBuffer以及它的API的详细使用方法。转载请注明出处:http://www.cnblogs.com/skywang12345/p/string03.htmlStringBuff

    2022年7月3日
  • PostgreSQL-模糊查询

    PostgreSQL-模糊查询!/bin/bash1模糊查询时,大多数情况下首先想到的是like‘%关键字%’或基于gin索引的正则表达式,gin至少需要三个字符才会使用索引,对于汉语来说十分不方便;2在海量数据的情况下,基于like和gin索引的正则表达式均不理想时,一般采用分词后进行查询.3分词存在两个弊端3.1词库的维护是比较繁重的工作.当词库中没有的关键词会导致查询结果不正确.3.2历史数据的维护工作不好处理

    2022年5月7日
  • react拖拽排序组件_uniapp拖拽生成器

    react拖拽排序组件_uniapp拖拽生成器移动端的拖拽排序在react中实现 了解一下

    2022年4月20日
  • java scanner next nextline nextint区别

    java scanner next nextline nextint区别next表示返回第一个字符串而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。简单的说nextLine() 返回的是一行。而next() 返回的只是第一个输入。 比如;输入hello java nextLine() 读的是hello java next() 读的是hello

    2022年5月17日

发表回复

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

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