[USACO11JAN]大陆议会The Continental Cowngress_2-sat

题意:

由于对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‘)。

他们的投票结果分别为VB_i (VB_i in {‘Y‘, ‘N‘}) and VC_i (VC_i in {‘Y‘, ‘N‘})。 最后,议案会以如下的方式决定:每只奶牛投出的两票中至少有一票和最终结果相符合。 例如Bessie给议案1投了赞成‘Y‘,给议案2投了反对‘N‘,那么在任何合法的议案通过 方案中,必须满足议案1必须是‘Y‘或者议案2必须是‘N‘(或者同时满足)。

给出每只奶牛的投票,你的工作是确定哪些议案可以通过,哪些不能。

如果不存在这样一个方案, 输出"IMPOSSIBLE"。

如果至少有一个解,输出:

Y如果在每个解中,这个议案都必须通过

N 如果在每个解中,这个议案都必须驳回

? 如果有的解这个议案可以通过,有的解中这个议案会被驳回

分析:

2-sat裸题。

两票a,b至少有一票是对的,那么我们把false[a]连到true[b],把false[b]连到true[a]。

转化为图论问题。对于这道题,我们直接暴力枚举每个点是false/true进行dfs染色。

这个点不可能是false/true当且仅当它染色时同时染到了同一个点的true和false。

求出每个点作为false/ture的可能性,四种刚好对应题目要求。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 2500
#define M 45000
int head[N],to[M],nxt[M],cnt,n,m;
int mrk[N],Q[N],ans[N],l,r,vis[N];
char s1[20],s2[20];
inline void add(int u,int v){
    to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
int bfs(int s){
    memset(vis,0,sizeof(vis));
    l=r=0;vis[s]=1;Q[r++]=s;
    while(l<r){
        int x=Q[l++];vis[x]=1;
        for(int i=head[x];i;i=nxt[i]){
            if(vis[to[i]])continue;
            Q[r++]=to[i];vis[to[i]]=1;
        }
    }
    for(int i=1;i<=n;i++){
        if(vis[i]&&vis[i+n])return 0;
    }return 1;
}
int main(){
    scanf("%d%d",&n,&m);
    int x,y,tx,ty;
    for(int i=1;i<=m;i++){
        scanf("%d%s%d%s",&x,s1,&y,s2);
        if(s1[0]==‘Y‘)tx=1;else tx=0;
        if(s2[0]==‘Y‘)ty=1;else ty=0;
        add((1-tx)*n+x,ty*n+y);
        add((1-ty)*n+y,tx*n+x);
    }
    for(int i=1;i<=n;i++){
        int t=bfs(i+n),f=bfs(i);
        if(t==0&&f==0){
            puts("IMPOSSIBLE");return 0;
        }
        if(t&&f)ans[i]=0;
        if(t&&!f)ans[i]=1;
        if(!t&&f)ans[i]=2;
    }
    for(int i=1;i<=n;i++){
        if(ans[i]==0)printf("?");
        else if(ans[i]==1)printf("Y");
        else printf("N");
    }
}

原文地址:https://www.cnblogs.com/suika/p/8457467.html

时间: 2024-10-11 16:27:25

[USACO11JAN]大陆议会The Continental Cowngress_2-sat的相关文章

P3007 [USACO11JAN]大陆议会The Continental Cowngress

P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 "支持或反对某法案", 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代表不能若是有的解中法案可以通过, 有些不能则输出"?" 哇这题确认过眼神, 遇上对的测评机莫名洛谷 \(RANK 1\) 首先若是没有输出 \(?\) 这题就是一个裸的 限

世界500强榜单出炉:中国公司首进三强 沃尔玛居首

http://world.gmw.cn/2014-07/07/content_11872941_2.htm 五家最赚钱的公司:沃达丰.两房.中国工商银行[0.88% 资金 研报].苹果 如果按利润将所有上榜公司从高到低排列,沃达丰利润大涨13794.5%至941亿美元,成为今年世界500强利润最高的公司. 房利美和房地美紧随其后,随着美国房地产市场回暖,其利润也一路走高,分别为840亿美元和487亿美元,它们也是今年最赚钱的美国500强公司. 中国最赚钱的500强公司则是中国工商银行,它的利润为

美石油高管称页岩油产量将反弹

英国<金融时报>昨天报道称,沙特一名官员声称,较低的油价阻碍了成本较高的石油(比如页岩油)的投资.大陆资源公司(Continental Resources)首席执行官哈罗德?汉姆(Harold Hamm)驳斥了这种说法.http://www.ximalaya.com/zhubo/27465785/ http://www.ximalaya.com/zhubo/27465800/ http://www.ximalaya.com/zhubo/27465803/ http://www.ximalaya

没有人会告诉您乘坐飞机时的几个事实 但是您一定要知道

飞机缩小了地球上的距离,它使人们对世界的认识也发生了改变.以往的〝天涯海角〞如今在飞机这种交通工具的面前也不过是〝数小时之遥〞的概念了,人们对飞机的利用早已司空见惯.这个会飞的庞然大物看上去既熟悉又陌生,它有您不知道的事实和您对飞机认识的误区.这篇文章旨在给您解谜和消除你长久以来的恐惧心理. 长久以来,飞机在起飞及降落时,机长都会以飞行安全为由,要求乘客关闭所有电子用品的电源,包括手机.平板电脑.笔记型电脑还有相机. 但是,据<每日邮报>的报导,从当天下午起澳航(Qantas)以及澳洲维珍航空

HIT 1917 2—SAT

题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会. 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委员会的成员, 现要你判断满足要求的和平委员会能否创立?如果能,请任意给出一种方案.( POI 0106 ) ----------------------------------------- 这道题就是裸的2-SAT 不过我用了tarjan缩点 然后一波拓排 tips:一个问题无解当且仅当一个集合的

杂项-公司:大陆集团

ylbtech-杂项-公司:大陆集团 大陆集团(德语:Continental AG,简称:Conti),德国运输行业制造商.主要产品为轮胎,制动系统,车身稳定控制系统,发动机喷射系统,转速表,以及其他汽车和运输行业零部件. 该公司总部设在德国汉诺威.它是世界第四大轮胎制造商,排在普利司通,米其林和固特异之后.他的前身是创立于1871年的橡胶制造商,Continental-Caoutchouc und Gutta-Percha Compagnie.在收购了Siemens VDO之后 ,它已成为全球

AC日记——贪婪大陆 洛谷 P2184

贪婪大陆 思路: 树状数组: 跪烂.. 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 int n,m,ltree[maxn],rtree[maxn],tot; inline void in(int &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0')Cget=getchar(); while(Cget>='0

LA 3211 飞机调度(2—SAT)

https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间为E,晚着陆时间为L,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使得整个着陆计划尽量安全.换句话说,如果把所有飞机的实际着陆时间按照从早到晚的顺序排列,相邻两个着陆时间间隔的最小值. 思路: 二分查找最大值P,每次都用2—SAT判断是否可行. 1 #include<iostream>

FutureNet可靠么?是谁对接进大陆的?

FutureNet可靠么?是谁对接进大陆的?FutureNet薇咨询:xo228228,FutureNet,FutureNet公司合法吗?FutureNet公司背景简介.FutureNet是传销吗?FutureNet合法吗?FutureNet传销骗局带图,FutureNet是传销吗?FutureNet怎么样?FutureNet好不好?为什么要选择FutureNet呢?FutureNet有什么优势呢?FutureNet怎么样?FutureNet怎么注册?FutureNet怎么加入?FutureNe