zoukankan      html  css  js  c++  java
  • 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
    ");
        }
    }
    
  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10775394.html
Copyright © 2011-2022 走看看