BZOJ 2199: [Usaco2011 Jan]奶牛议会 [2-SAT 判断解]

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

题意:裸的2-SAT,但是问每个变量在所有解中是只能为真还是只能为假还是既可以为真又可以为假



这样的话求$SCC$的做法就不好做了

于是只能用$naive$做法了,枚举每个变量选择真假然后$dfs$一遍看看是否可行

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=2005,M=2e5+5;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
inline void get(int &x,char &c){
    c=getchar();
    while(c!=‘h‘&&c!=‘m‘) c=getchar();
    x=read()<<1;
}
int n,m,x,y,vx,vy;
char s[3];
struct edge{
    int v,ne;
}e[M];
int h[N],cnt=0;
inline void ins(int u,int v){
    cnt++;
    e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
}
bool mark[N];
bool dfs(int u){
    if(mark[u^1]) return false;
    if(mark[u]) return true;
    mark[u]=1;
    for(int i=h[u];i;i=e[i].ne)
        if(!dfs(e[i].v)) return false;
    return true;
}
bool check(int u){
    memset(mark,0,sizeof(mark));
    return dfs(u);
}
char ans[N];
int main(){
    freopen("in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=m;i++){
        x=read()<<1;scanf("%s",s);vx=s[0]==‘Y‘;
        y=read()<<1;scanf("%s",s);vy=s[0]==‘Y‘;
        x|=vx;y|=vy;
        ins(x^1,y);ins(y^1,x);
    }
    for(int i=1;i<=n;i++){
        int p=check(i<<1),q=check(i<<1|1);
        if(!p&&!q){puts("IMPOSSIBLE");return 0;}
        else if(p&&q) ans[i]=‘?‘;
        else if(q) ans[i]=‘Y‘;
        else ans[i]=‘N‘;
    }
    for(int i=1;i<=n;i++) putchar(ans[i]);
}
时间: 2024-12-14 23:31:14

BZOJ 2199: [Usaco2011 Jan]奶牛议会 [2-SAT 判断解]的相关文章

【BZOJ2199】[Usaco2011 Jan]奶牛议会 2-SAT

[BZOJ2199][Usaco2011 Jan]奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出“是

【BZOJ2199】 [Usaco2011 Jan]奶牛议会

Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M <= 4000) 会给N个议案投票(1 <= N <= 1,000) .每只 奶牛会对恰好两个议案 B_i and C_i (1 <= B_i <= N; 1 <= C_i <= N)投 出“是”或“否”(输入文件中的'Y'和'N').他们的投票结果分别

BZOJ2199 [Usaco2011 Jan]奶牛议会

首先激励一个2-SAT的裸模型,然后发现...tarjan没法判断'?'的情况 于是暴力对每一个议案check一下,直接dfs即可 1 /************************************************************** 2 Problem: 2199 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:160 ms 7 Memory:884 kb 8 ********************

bzoj:1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会

Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the

bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会【tarjan】

几乎是板子,求有几个size>1的scc 直接tarjan即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=10005; int n,m,h[N],cnt,ans,tmp,dfn[N],low[N],s[N],top; bool v[N]; struct qwe { int ne,to; }e[N*10]; int read() { i

BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划( dp)

dp乱搞即可...( 我就是这样 A 的.. 后来想改快一点..然后就WA了...不理了 ------------------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n )

BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )

tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 5009; struct edge { int to; b

[BZOJ] 1634: [Usaco2007 Jan]Protecting the Flowers 护花

1634: [Usaco2007 Jan]Protecting the Flowers 护花 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 827  Solved: 536[Submit][Status][Discuss] Description Farmer John went to cut some wood and left N (2 <= N <= 100,000) cows eating the grass, as usual. When

[BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线

1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1806  Solved: 773[Submit][Status][Discuss] Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废