• JSOI2010 满汉全席


    题目链接:戳我

    一个2-SAT的模板题。
    (什么是2-SAT呢?就是解决一个情况两种决策的问题,我们根据“选了其中一个点A就必须选一个点B的原则,从A向B连边。最后判断如果在一个强连通分量里面,就是无解。”)

    注意一下输入的转换就好啦!QAQ

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define MAX 1010
    struct Line{int v,next;}e[100000];
    int h[MAX],cnt=1,T;
    inline void add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
    int n,m,a[MAX][2];
    inline int get()
    {
        char s[10];
        int cur=0,x=0;
        scanf("%s",s);
        if(s[0]=='m') cur=n;
        for(int i=1,len=strlen(s);i<len;i++)
            x=x*10+s[i]-'0';
        x+=cur;
        return x;
    }
    bool id[MAX][MAX];
    int dfn[MAX],low[MAX],st[MAX],top,tim,G[MAX];
    bool ins[MAX];
    void init()
    {
        memset(id,0,sizeof(id));
        memset(h,0,sizeof(h));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(ins,0,sizeof(ins));
        memset(G,0,sizeof(G));
        cnt=0;top=tim=0;
    }
    
    inline void tarjan(int x)
    {
        dfn[x]=low[x]=++tim;
        st[++top]=x;
        ins[x]=1;
        for(int i=h[x];i;i=e[i].next)
        {
            int v=e[i].v;
            if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);
            else if(ins[v]) low[x]=min(low[x],dfn[v]);
        }
        if(dfn[x]==low[x])
        {
            int v;
            ++cnt;
            if(st[top]==x) {G[x]=cnt;ins[x]=0;top--;}
            else
            {
                do
                {
                    v=st[top];
                    top--;
                    G[v]=cnt;
                    ins[v]=0;
                    // printf("cnt=%d v=%d
    ",cnt,v);
                }while(v!=x);
            }
        }
    }
    
    bool check()
    {
        for(int i=1;i<=n;++i)
            if(G[i]==G[i+n])return false;
        return true;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            init();
            for(int i=1;i<=m;++i)a[i][0]=get(),a[i][1]=get();
            for(int i=1;i<=m;++i)
                for(int j=i+1;j<=m;++j)
                {
                    if(abs(a[i][0]-a[j][0])==n)
                        id[a[i][0]][a[j][1]]=id[a[j][0]][a[i][1]]=1;
                    if(abs(a[i][0]-a[j][1])==n)
                        id[a[i][0]][a[j][0]]=id[a[j][1]][a[i][1]]=1;
                    if(abs(a[i][1]-a[j][0])==n)
                        id[a[i][1]][a[j][1]]=id[a[j][0]][a[i][0]]=1;
                    if(abs(a[i][1]-a[j][1])==n)
                        id[a[i][1]][a[j][0]]=id[a[j][1]][a[i][0]]=1;
                }
            for(int i=1;i<=n+n;++i)
                for(int j=1;j<=n+n;++j)
                    if(id[i][j])
                        add(i,j);
            for(int i=1;i<=n+n;++i)
                if(!dfn[i])
                    tarjan(i);
            if(check()) printf("GOOD
    ");
            else printf("BAD
    ");
        }
    }
    
  • 相关阅读:
    I-string_2019牛客暑期多校训练营(第四场)
    hackerrank Palindromic Border
    hackerrank Circular Palindromes
    uoj424
    bzoj5384
    uoj450
    QTP 表格的导入导出异常信息 笔记
    QTP基本循环异常遍历(代码方式实现)
    QTP基本循环正常遍历(代码方式实现)
    《大道至简》读后感
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10775394.html
Copyright © 2020-2023  润新知