zoukankan      html  css  js  c++  java
  • poj32072-sat模板题

    tarjan扫一遍后直接判断

    最关键的地方就是建边(x[i] <= x[j] && y[i] >= x[j] && y[i] <= y[j]) || (x[i] >= x[j] && x[i] <= y[j] && y[i] >= y[j])

    建边条件:x[ i ] < = x [ j ] < = y [ i ] < =y [ j ]或者 x [ j ] < = x [ i ] < = y [ j ] < = y [ i ]

    这样的话 i 和 j 肯定是相交的,那么连边 ~i ,j 和 i,~j 这样保证了 i 和 j 是不相交的

    如果同一个点的拆分在同一个强连通分量里面,那么就无法实现(因为这样i在同一个环中了)

    注意 i 和 i + 1是同一个点拆分得到的

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1000+10,maxn=1000+10,inf=0x3f3f3f;
    
    stack<int>s;
    int dfn[N],low[N];
    int inans[N],ins[N];
    int num,index;
    int n,m;
    int x[N],y[N];
    vector<int>v[N];
    void tarjan(int u)
    {
        ins[u]=2;
        dfn[u]=low[u]=++index;
        s.push(u);
        for(int i=0;i<v[u].size();i++)
        {
            int x=v[u][i];
            if(dfn[x]==0)
            {
                tarjan(x);
                low[u]=min(low[u],low[x]);
            }
            else if(ins[x]==2)low[u]=min(low[u],dfn[x]);
        }
        if(dfn[u]==low[u])
        {
            ++num;
            while(!s.empty()){
                int k=s.top();
                s.pop();
                ins[k]=1;
                inans[k]=num;
                if(k==u)break;
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        memset(inans,0,sizeof inans);
        memset(ins,0,sizeof ins);
        memset(dfn,0,sizeof dfn);
        memset(low,0,sizeof low);
        for(int i=1;i<=2*m;i++)v[i].clear();
        while(!s.empty())s.pop();
        index=num=0;
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        {
            cin>>x[i]>>y[i];
            if(x[i]>y[i])swap(x[i],y[i]);
        }
        for(int i=1;i<=m;i++)
            for(int j=i+1;j<=m;j++)
                if((x[i] <= x[j] && y[i] >= x[j] && y[i] <= y[j]) || (x[i] >= x[j] && x[i] <= y[j] && y[i] >= y[j]))
                {
                    v[2*i-1].push_back(2*j);
                    v[2*j].push_back(2*i-1);
                    v[2*j-1].push_back(2*i);
                    v[2*i].push_back(2*j-1);
                }
        for(int i=1;i<=2*m;i++)
            if(!dfn[i])
               tarjan(i);
        bool f=0;
        for(int i=1;i<2*m;i+=2)
            if(inans[i]==inans[i+1])
            {
                f=1;
                break;
            }
        if(f)cout<<"the evil panda is lying again"<<endl;
        else cout<<"panda is telling the truth..."<<endl;
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    maven junit.framework不存在问题解决
    maven项目在打war包时出现非法字符: 'ufeff' 解决方案
    如何隐藏tomcat命令窗口
    小程序如何生成开发版的带参二维码
    小程序码生成随记
    生活中的一些笔记
    存储过程
    项目出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
    maven环境配置详解,及maven项目的搭建及maven项目聚合
    sqldeveloper和plsqldebeloper
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7306550.html
Copyright © 2011-2022 走看看