bzoj1823

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

2-sat裸题

#include<bits/stdc++.h>
using namespace std;
const int N = 4010;
struct edge {
    int nxt, to;
} e[N];
int n, m, Time, cot, top, cnt = 1;
int dfn[N], low[N], vis[N], st[N], belong[N], head[N];
void link(int u, int v)
{
    e[++cnt].nxt = head[u];
    head[u] = cnt;
    e[cnt].to = v;
}
void tarjan(int u)
{
    st[++top] = u; dfn[u] = low[u] = ++Time; vis[u] = 1;
    for(int i = head[u]; i; i = e[i].nxt)
    {
        if(!dfn[e[i].to]) tarjan(e[i].to);
        if(vis[e[i].to]) low[u] = min(low[u], low[e[i].to]);
    }
    if(dfn[u] == low[u]) { ++cot; while(st[top + 1] != u) belong[st[top]] = cot, vis[st[top--]] = 0; }
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        top = 0; cnt = 1;
        memset(e, 0, sizeof(e));
        memset(head, 0, sizeof(head));
        memset(dfn, 0, sizeof(dfn));
        memset(low, 0, sizeof(low));
        memset(belong, 0, sizeof(belong));
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++i)
        {
            link(i, i + 3 * n);
            link(i + n, i + 2 * n);
        }
        for(int i = 1; i <= n; ++i)
        {
            link(i, i + 3 * n);
            link(i + n, i + 2 * n);
        }
        for(int i = 1; i <= m; ++i)
        {
            char c1[10], c2[10]; int x = 0, y = 0;
            scanf("%s%s", c1, c2);
            for(int i = 1; i < strlen(c1); ++i) x = x * 10 + c1[i] - ‘0‘;
            for(int i = 1; i < strlen(c2); ++i) y = y * 10 + c2[i] - ‘0‘;
            if(c1[0] == ‘h‘) x += n; if(c2[0] == ‘h‘) y += n;
            link(x + 2 * n, y); link(y + 2 * n, x);
        }
        bool flag = true;
        for(int i = 1; i <= 4 * n; ++i) if(!dfn[i]) tarjan(i);
        for(int i = 1; i <= 2 * n; ++i) if(belong[i] == belong[i + 2 * n])
        { puts("BAD"); flag = false; break; }
        if(flag) puts("GOOD");
    }
    return 0;
}

时间: 2024-10-25 23:15:14

bzoj1823的相关文章

bzoj1823 JSOI2010 满汉全席 2-SAT 经典建模

这个题其实我一开始看完没有想到2-SAT 而思路巧妙,编程复杂度低也是我选这个题的原因,在3h4t的赛制中非常适合(好像是病句..) 具体的来说就是,因为每种材料都有两个选择,那就是做成满式或者是汉式 那么我们可以考虑,在信息学奥赛中,只有两种选择的有哪些.. 看来只有二分图和2-SAT了? 然后我们注意到,每个选择是互相排斥的,那么这不正好符合2-SAT的性质么?--每个布尔变量只能是成立或者是不成立,这与满式汉式这好一样. 好那如果你已经想到2-SAT了以后这题基本就出来了 因为本题根本不用

【BZOJ1823】[JSOI2010]满汉全席 2-SAT

[BZOJ1823][JSOI2010]满汉全席 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一. 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师.为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员

BZOJ1823 [JSOI2010]满汉全席 2-sat

原文链接http://www.cnblogs.com/zhouzhendong/p/8125944.html 题目传送门 - BZOJ1823 题意概括 有n道菜,分别可以做成满式和汉式(每道菜只能做成一种形式),有m个专家. 每个专家喜欢两种菜,比如汉式猪肉和满式牛肉. 问是否存在方案使得所有专家都被满足. 题解 2-sat模版题,连方案都不用输出,水过-- 代码 #include <cstring> #include <cstdio> #include <cstdlib&

【BZOJ1823】 [JSOI2010]满汉全席

Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一. 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师.为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日

bzoj1823: [JSOI2010]满汉全席

2-SAT. 好像很复杂的样子所以还在慢慢摸索... 这道题只需要tarjan缩点就可以了,如果有一个材料的满式和汉式同时被选中,代表不可能实现. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 5000 + 10; int g[maxn],v[maxn],next[maxn],eid; int n,m,T; int dfn[maxn

bzoj1823满汉全席

2-set模板 这篇博客写得非常好 传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<vector> #include<queue> #include<ctime> #include<cmath> const int N=10

浅谈2-sat的问题的构造与求解

2-sat问题是一种常见的问题.给定若干个01变量,变量之间满足一些二元约束,求是否有解存在.若存在,给出可行解或按照字典序给出最优解. 下面给出与其对应的图论模型:给每个变量i设立2个点,我的习惯是记为T(i),F(i),分别表示其值取1,0. 下面考虑的便是如何进行限制了. 一般的限制形式均如下所示: 变量i取x时,变量j只能取y,那么表示i取x的点向表示j取y的点连一条有向边.表示推出关系. 类似的,若表示变量i取x时,变量j不能取y,那么表示i取x的点向表示j取~y的点连一条有向边.因为

讨论2-sat建设和解决问题

2-sat问题是一种常见的问题.给定若干个01变量,变量之间满足一些二元约束,求是否有解存在.若存在,给出可行解或依照字典序给出最优解. 以下给出与其相应的图论模型:给每一个变量i设立2个点,我的习惯是记为T(i),F(i),分别表示其值取1,0. 以下考虑的便是怎样进行限制了. 一般的限制形式均例如以下所看到的: 变量i取x时,变量j仅仅能取y,那么表示i取x的点向表示j取y的点连一条有向边.表示推出关系. 类似的,若表示变量i取x时,变量j不能取y,那么表示i取x的点向表示j取~y的点连一条

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ