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;
}

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

  1. Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress

    P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...

  2. P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)

    简述:给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代 ...

  3. [BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT)

    [BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT) 题面 题面较长,略 分析 考虑把问题转化成一个依赖性问题 我们把每只奶牛投出 ...

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

    [USACO11JAN]大陆议会The Continental Cowngress_2-sat 题意: 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会. 议会以“每头 ...

  5. 智课雅思词汇---十二、vent是什么意思

    智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...

  6. COGS1008. 贪婪大陆[树状数组 模型转换]

    1008. 贪婪大陆 ★★   输入文件:greedisland.in   输出文件:greedisland.out   简单对比时间限制:1 s   内存限制:128 MB 试题四:贪婪大陆  [题 ...

  7. BZOJ1922 [Sdoi2010]大陆争霸

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...

  9. C++之路进阶——bzoj2199(奶牛议会)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

随机推荐

  1. 20145214 《网络对抗技术》 Web安全基础实践

    20145214 <网络对抗技术> Web安全基础实践 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的 ...

  2. VS2010+WinXP+MFC程序 无法定位程序输入点于动态链接库

    1.问题描述 原开发环境:Win7 64位旗舰版,VS2010,ThinkPad T460 出现问题:自己开发的MFC程序在WinXP环境下无法正常运行,弹框“无法定位程序输入点InitializeC ...

  3. iOS开发学习-类似微信聊天消息中的电话号码点击保存到通讯录中的功能

    类似微信聊天消息中的电话号码点击保存到通讯录中的功能,ABAddress的实现在iOS9中是不能正常使用的,点击完成后,手机会非常的卡,iOS9之后需要使用Contact新提供的方法来实现该功能.快捷 ...

  4. C++ MOOC

    相关课程列表: C++远征之起航篇 C++远征之离港篇 C++远征之封装篇 上 C++远征之封装篇 下 C++远征之继承篇 C++远征之多态篇 授课老师:james_yuan 在寒假,我主要选择 C+ ...

  5. java中static使用之静态方法注意点

    1.静态方法可以直接调用同类中的静态成员,但是不能直接调用非静态成员,这是为什么呢?大家想一下,静态成员在对象创建之前就要写入内存,所以它在内存中是实实在在的存在的,而非静态还不存在内存中,所以不能调 ...

  6. week3a:个人博客作业

    1.博客上的问题 阅读下面程序,请回答如下问题: using System; using System.Collections.Generic; using System.Text; namespac ...

  7. 上传插件(WebUploader)

    官网:http://fex.baidu.com/webuploader/插件下载:https://github.com/fex-team/webuploader/releases/download/0 ...

  8. js 代码几种方式

    var nameSpace={ //public } (function(){ //private })(); var module=(function(){ //private return { / ...

  9. 模拟alert,confirm 阻塞状态

    /*** * 模拟alert弹窗 * content 为弹框显示的内容 * 确定按钮对应的下面取消关闭显示框 * **/function oAlert(content) { var oWrap = $ ...

  10. 补发9.27“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.27 地点:612寝 组员 已完成 未完成 王森 分析设计亮点 原型搭建 张金生 设计UI框架 美化完善 张政 学习C#语言初步应用 熟练 ...