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. Last Daily Scrum (2015/11/9)

    今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...

  2. OO第四阶段总结

    一.测试与正确性论证的区别 从哲学的角度来说,正确性论证与测试的关系就像理论与实践的关系一样. 使用测试的方法检验程序正确性确实是一个非常方便可行且广泛运用的方法.可以通过几个简单或复杂的测试样例,迅 ...

  3. 【图论】POJ-3169 差分约束系统

    一.题目 Description Like everyone else, cows like to stand close to their friends when queuing for feed ...

  4. 交换机、linux光衰查询

    RX收光,TX发光 一.交换机 命令: display interface transceiver brief 结果: ...... HW6851 10GE1/0/15 transceiver dia ...

  5. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day6)

    提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 数据库整理. 吴慧婷:我的世界界面完成部分. 陈敏: 我的世界功能--学习情况功能完成. 吴雅娟:我的世界功能--学习 ...

  6. 斑马条码打印机GK888T打印标签是间隔的 ,不是连续的

    有间断的标签纸和连续的标签纸是两种不同的纸张类型, 打印机的标签感应器需要工作在不同的模式来跟踪感应它们. 打印机正确感应纸张才不会红灯闪烁,打印的内容才按文件设计打印到标签的对应位置上. 所以要在驱 ...

  7. UVA11248_Frequency Hopping

    给一个有向网络,求其1,n两点的最大流量是否不小于C,如果小于,是否可以通过修改一条边的容量使得最大流量不小于C? 首先对于给定的网络,我们可以先跑一遍最大流,然后先看流量是否大于C. 然后保存跑完第 ...

  8. Acdream1311_Apple

    无聊的时候看到上一次acdream群赛的一个题目,中间居然是有alice和bob的博弈题目,于是就去做了. 给n,m,两人轮流操作,每次操作可以使n+1,或者m+1,谁操作后满足nm>=A,那么 ...

  9. BZOJ3246 IOI2013Dreaming

    如果将森林里每棵树都各自看做一个点,那么最后所连成的树应该是一颗菊花,否则将叶子节点父亲改为根不会更劣. 对于每个点所代表的树,其和根节点相连的点应该是到其他点距离最大值最小的点.这个点显然是直径的中 ...

  10. 【BZOJ1046】上升序列(动态规划,贪心)

    [BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...