zoukankan      html  css  js  c++  java
  • 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)

    题目

    传送门:QWQ

    分析

     2-sat模板(然而辣鸡如我还是调了好久)

    代码

    //bzoj 1823 2-sat
    #include <bits/stdc++.h>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int get()
    {
        int x; char c=getchar();
        while(c!='m'&&c!='h')c=getchar();
        if(c=='m')x=read()*2; else x=read()*2-1;
        return x;
    }
    
    struct Edge{
        int from,to;
    };
    vector<int> G[20005];
    int low[4005], dfn[4005], sccno[4005], dfs_clock, scc_num;
    stack<int> s;
    void insert(int u,int v){
        G[u].push_back(v);
    }
    void tarjan(int u)
    {
        dfn[u]=low[u]=++dfs_clock; s.push(u);
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(!dfn[v]){
                tarjan(v);
                low[u]=min(low[u], low[v]);
            }else if(!sccno[v]){
                low[u]=min(low[u], dfn[v]);
            }
        }
        if(low[u]==dfn[u]){
            scc_num++;
            for(;;){
                int x=s.top(); s.pop(); 
                sccno[x]=scc_num;
                if(x==u) break;
            }
        }
    }
    
    int main()
    {
        int n,m,T=read();
        while(T--)
        {
            while(!s.empty()) s.pop();
            n=read(); m=read();
            int x,y,xp,yp;
            for(int i=0;i<m;i++)
            {
                x=get(); y=get();
                if(x%2==0)xp=x--;
                else xp=x++;
                if(y%2==0)yp=y--;
                else yp=y++;
                insert(xp,y); insert(yp,x);
            }
            
            memset(dfn,0,sizeof(dfn)); memset(sccno,0,sizeof(sccno));
            dfs_clock=scc_num=0;
            for(int i=1;i<=2*n;i++)
                if(!dfn[i]) tarjan(i);
            
            bool flag=1;
            for(int i=1;i<=n;i++)
                if(sccno[2*i]==sccno[2*i-1]) flag=false;
            if(flag) puts("GOOD");
            else puts("BAD");
            for(int i=0;i<=2*n;i++) G[i].clear();
        }
        return 0;
    }
  • 相关阅读:
    Spring配置多个数据源
    虚拟机内存结构
    Java中sleep,wait,yield,join的区别
    Java的四种引用方式
    Java 中的泛型详解-Java编程思想
    Java RTTI和反射
    linux 分析java 线程状态
    小容量的byteBuffer 读取大文本
    @Conditional 原理
    替换字符串占位符
  • 原文地址:https://www.cnblogs.com/noblex/p/8552303.html
Copyright © 2011-2022 走看看