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;
}
P3007 [USACO11JAN]大陆议会The Continental Cowngress的更多相关文章
- Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...
- P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
简述:给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代 ...
- [BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT)
[BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT) 题面 题面较长,略 分析 考虑把问题转化成一个依赖性问题 我们把每只奶牛投出 ...
- [USACO11JAN]大陆议会The Continental Cowngress_2-sat
[USACO11JAN]大陆议会The Continental Cowngress_2-sat 题意: 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会. 议会以“每头 ...
- 智课雅思词汇---十二、vent是什么意思
智课雅思词汇---十二.vent是什么意思 一.总结 一句话总结:词根:ven, vent = come, 表示“来” 词根:vent = wind 风 1.tact是什么意思? 词根:-tact-, ...
- COGS1008. 贪婪大陆[树状数组 模型转换]
1008. 贪婪大陆 ★★ 输入文件:greedisland.in 输出文件:greedisland.out 简单对比时间限制:1 s 内存限制:128 MB 试题四:贪婪大陆 [题 ...
- BZOJ1922 [Sdoi2010]大陆争霸
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...
- C++之路进阶——bzoj2199(奶牛议会)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
随机推荐
- spring中的@component
@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>) 泛指各种组件, ...
- Tomcat提高并发
Centos7环境下Tomcat 启动慢的解决方案1.增加熵值(本质增加random)安装软件 >> Yum –y install rng-tools 启动熵服务 >> Sys ...
- CentOS7服务器上搭建Gitlab
Gitlab如何搭建? 安装gitlab所需要的依赖 sudo yum install curl policycoreutils openssh-server openssh-clients 使ssh ...
- 进阶系列(2)—— C#集合
一.集合介绍 集合是.NET FCL(Framework Class Library)的重要组成部分,我们平常撸C#代码时免不了和集合打交道,FCL提供了丰富易用的集合类型,给我们撸码提供了极大的便利 ...
- 自己对git的认识。
刚打开这个软件的网页,只能用一个字来形容,蒙,蒙,蒙,重要的事要说三遍,全英文的,这到底是什么东西,连注册都得慢慢翻译,这英语基础实在是太差劲了. 看了老师推荐的对Git使用介绍,由于之前对这个软件的 ...
- coreseek优化
问题前提: 这篇博客是在你已经安装并使用coreseek的前提下,并且在使用过程中发现当前默认的分词效果不佳时作为参考. 解决方案: 1.扩展基本词典 参考: http://jockchou.gith ...
- Hadoop HA 深度解析
社区hadoop2.2.0 release版本开始支持NameNode的HA,本文将详细描述NameNode HA内部的设计与实现. 为什么要Namenode HA? 1. NameNode High ...
- 深入理解Java类加载器(2)
1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...
- JVM的GC策略
1 前言 GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让Java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理. 说一句题外话,我 ...
- Python开发【第五篇】迭代器、生成器、递归函数、二分法
阅读目录 一.迭代器 1. 迭代的概念 #迭代器即迭代的工具(自定义的函数),那什么是迭代呢? #迭代:指一个重复的过程,每次重复都可以称之为一次迭代,并且每一次重复的结果是下一个迭代的初始值(例如: ...