• [JSOI 2010] 满汉全席


    [题目链接]

              https://www.lydsy.com/JudgeOnline/problem.php?id=1823

    [算法]

             2-SAT

    [代码]

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 110
    #define MAXM 1010
    
    struct edge
    {
            int to,nxt;
    } e[MAXM << 1];
    
    int timer,cnt,top,tot;
    int dfn[MAXN << 1],low[MAXN << 1],belong[MAXN << 1],s[MAXN << 1],head[MAXN << 1];
    bool instack[MAXN];
    
    template <typename T> inline void read(T &x)
    {
            int f = 1; x = 0;
            char c = getchar();
            for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
            for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
            x *= f;
    }
    inline void addedge(int u,int v)
    {
            tot++;
            e[tot] = (edge){v,head[u]};
            head[u] = tot; 
    }
    inline void tarjan(int u)
    {
            low[u] = dfn[u] = ++timer;
            instack[u] = true;
            s[++top] = u;
            for (int i = head[u]; i; i = e[i].nxt)
            {
                    int v = e[i].to;
                    if (!dfn[v])
                    {
                            tarjan(v);
                            low[u] = min(low[u],low[v]);
                    } else if (instack[v]) low[u] = min(low[u],dfn[v]);
            }
            if (low[u] == dfn[u])
            {
                    cnt++;
                    while (s[top + 1] != u)
                    {
                            instack[s[top]] = false;
                            belong[s[top]] = cnt;
                            top--;
                    }
            }
    }
    int main() 
    {
            
            int T;
            read(T);
            while (T--)        
            {
                    int n,m;
                    read(n); read(m);
                    tot = 0;
                    for (int i = 1; i <= 2 * n; i++) head[i] = 0;
                    for (int i = 1; i <= m; i++)
                    {
                            char a[20] , b[20];
                            scanf("%s%s",a + 1,b + 1);
                            int t1 = 0 , t2 = 0;
                            for (int j = 2; j <= strlen(a + 1); j++) t1 = t1 * 10 + a[j] - '0';
                            for (int j = 2; j <= strlen(b + 1); j++) t2 = t2 * 10 + b[j] - '0';
                            if (a[1] == 'm') addedge(t1 + n,t2 + (b[1] == 'h') * n);
                            else addedge(t1,t2 + (b[1] == 'h') * n);
                            if (b[1] == 'm') addedge(t2 + n,t1 + (a[1] == 'h') * n);
                            else addedge(t2,t1 + (a[1] == 'h') * n);
                    } 
                    timer = cnt = 0;
                    for (int i = 1; i <= 2 * n; i++) low[i] = dfn[i] = 0;
                    for (int i = 1; i <= 2 * n; i++)
                    {
                            if (!dfn[i])
                                    tarjan(i);
                    }
                    bool ans = true;
                    for (int i = 1; i <= n; i++)
                    {
                          if (belong[i] == belong[i + n]) 
                          {
                                  ans = false;
                                  break;
                            }
                    }
                    if (ans) printf("GOOD
    ");
                    else printf("BAD
    ");
            }
            
            return 0;
        
    }
  • 相关阅读:
    webserver的使用
    vs2010旗舰版中.net framework 4安装不成功的解决办法
    测量距离
    Mybatis初学习
    Mybatis的一些优化
    开博想法
    matplotlib 画图中的basemap安装问题
    Ubuntu 提示sudo: java: command not found解决办法
    django 中静态文件项目加载问题
    Velocity组装Xml报文
  • 原文地址:https://www.cnblogs.com/evenbao/p/9508025.html
Copyright © 2020-2023  润新知