P3007 [USACO11JAN]大陆议会The Continental Cowngress

P3007 [USACO11JAN]大陆议会The Continental Cowngress

题意: 给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代表不能若是有的解中法案可以通过, 有些不能则输出“?”



哇这题确认过眼神, 遇上对的测评机莫名洛谷 \(RANK 1\)

首先若是没有输出 \(?\) 这题就是一个裸的 限制条件为或 的 \(2-SAT\), 关键是我们如何处理这个 “可以在不同的解中为不同的状态”

回想一下在2-SAT里提到过的 ** \(Tarjan\) 的过程就是逻辑推理的过程 ,** 若是点 \(v\) 能由 \(u\) 到达, 那我们认为 满足意义 \(u\) 则一定需要满足意义 \(v\) , 那么我们很快就可以得到啥时候一个条件的两个状态(\(0\) 或 \(1\))没得关系了: 当 \(u\ ,\ v\) 两点不互达时, 他们之间无明确的互相限制关系

所以在确定有解以后, 我们在 \(Tarjan\) 后的 \(DAG\) 上对于一个法案的两种状态 \(dfs\) , 若不互通则此点状态任意
p.s:因为是 \(DAG\) 所以不用 \(vis[ ]\)数组
p.s.s:别忘了建新图的时候别搞自环。。。

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 2000019,INF = 1e9 + 19;
int head[maxn][2],nume = 1;
struct Node{
    int v,dis,nxt;
    }E[maxn << 2][2];
void add(int u,int v,int dis, int o){
    E[++nume][o].nxt = head[u][o];
    E[nume][o].v = v;
    E[nume][o].dis = dis;
    head[u][o] = nume;
    }
int num, nr;
int DFN[maxn], LOW[maxn], INDEX;
int S[maxn], top;
bool ins[maxn];
int col[maxn], numc;
void Tarjan(int u){
    DFN[u] = LOW[u] = ++INDEX;
    S[++top] = u;ins[u] = 1;
    for(int i = head[u][0];i;i = E[i][0].nxt){
        int v = E[i][0].v;
        if(!DFN[v])Tarjan(v), LOW[u] = min(LOW[u], LOW[v]);
        else if(ins[v])LOW[u] = min(LOW[u], DFN[v]);
        }
    if(DFN[u] == LOW[u]){
        numc++;
        while(S[top + 1] != u){
            col[S[top]] = numc;
            ins[S[top--]] = 0;
            }
        }
    }
bool dfs(int u, int goal){
    if(u == goal)return 1;
    for(int i = head[u][1];i;i = E[i][1].nxt){
        int v = E[i][1].v;
        if(dfs(v, goal))return 1;
        }
    return 0;
    }
bool check(int c1, int c2){
    if(!dfs(c1, c2) && !dfs(c2, c1)){
        printf("?");
        return 1;
        }
    return 0;
    }
int main(){
    num = RD();nr = RD();
    int a, b, x, y;char c1, c2;
    for(int i = 1;i <= nr;i++){
        a = RD(), cin>>c1, b = RD(), cin>>c2;
        if(c1 == 'Y')x = 1;else x = 0;
        if(c2 == 'Y')y = 1;else y = 0;
        //<< 1 | 0 -> 0 , << 1 | 1 -> 1
        add(a << 1 | (x ^ 1), b << 1 | y, 1, 0);
        add(b << 1 | (y ^ 1), a << 1 | x, 1, 0);
        }
    for(int i = 2;i <= (num << 1 | 1);i++)if(!DFN[i])Tarjan(i);
    for(int i = 1;i <= num;i++){
        if(col[i << 1] == col[i << 1 | 1]){
            puts("IMPOSSIBLE");
            return 0;
            }
        }
    for(int u = 2;u <= (num << 1 | 1);u++){
        for(int i = head[u][0];i;i = E[i][0].nxt){
            int v = E[i][0].v;
            if(col[u] == col[v])continue;
            add(col[u], col[v], 1, 1);
            }
        }
    for(int i = 1;i <= num;i++){
        if(check(col[i << 1], col[i << 1 | 1]))continue;
        if(col[i << 1] < col[i << 1 | 1])printf("N");
        else printf("Y");
        }
    puts("");
    return 0;
    }

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9461406.html

时间: 2024-08-30 13:58:01

P3007 [USACO11JAN]大陆议会The Continental Cowngress的相关文章

[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)投 出"是"或"否"(输

世界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)以及澳洲维珍航空

杂项-公司:大陆集团

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

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

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

【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').他们的投票结果分别

初心大陆-----python宝典

开始吧,决心要专注,把python吃掉. 打开python的大门吧. 先进入到python命令行 >>> print "Hello come python world" 敲入回车 Hello come python world >>> 看看效果貌似还不错,好的开始,计算机知道我想要和他说什么,哈哈会心一笑 还能不能愉快的聊天了..我决定创造个模拟世界(初心大陆),世界很简单角色暂定是 我:穿越到初心大陆的人 老师:python,原居住人起个好听的名字