【BZOJ-2199】奶牛议会
链接:
题意:
给出 \(n(1\leq n\leq 1000)\) 个点,\(m(1\leq m\leq 4000)\) 个形如:“点 \(a\) 取 \(ca\) 或 点 \(b\) 取 \(cb\),其中 \(ca,cb\in\{'Y','N'\}\)” 的限制。如果没有一组方案满足所有限制,输出"IMPOSSIBLE";否则,可能有多组满足限制的解。对于一个点,如果在所有方案中都取 \('Y'\) 则该点最终答案为 \('Y'\),如果在所有方案中都取 \('N'\) 则该点最终答案为 \('N'\),如果都能取到,则该点最终答案为 \('?'\) ,输出最终 \(n\) 个点的答案。
分析:
我们知道,如果只需要一组答案,那么这就是 2-sat 的模板,但是该题似乎需要求出所有方案?
于是我们回顾使用 tarjan 算法求强连通分量解决 2-set 问题中最后取值的部分。
我们知道一个点的 true 和 false 我们会选择拓扑序较大的,这是因为拓扑序较小的可能会连向拓扑序较大的,而此时我们只能选择拓扑序较大的,不然会出现错误。我们发现这就是某个点必须选择某种取值的情况,即上文"在所有方案中都取XXX",而相对应的,如果无法从拓扑序较小的连向较大的,就说明这两种取值都能取,也就是上文“如果都能取到”的情况了。所以我们的算法思路也就比较清晰了。
算法:
在正常 2-sat 建图,tarjan 求强连通分量后,如果无解,输出"IMPOSSIBLE",否则对强连通分量建图,使用 bfs 判断每个点的两种取值的连通性即可。此时,tarjan 时间复杂度 \(O(n+m)\),bfs \(O(n^2)\) ,将 \(n,m\) 视为同级别,则时间复杂度为 \(O(n^2)\),可以通过此题。
代码:
#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=2e3+5;
const int M=8e3+5;
struct edge{
int v,next;
}e[M];
int head[N],en;
void insert(int u,int v){
e[++en].v=v;
e[en].next=head[u];
head[u]=en;
}
int n,m;
int sta[N],low[N],dfn[N],id[N],sum,sign,top;
bool vis[N];
void dfs(int u){
low[u]=dfn[u]=++sign;
vis[u]=true;sta[++top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(!dfn[v]) dfs(v),low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
sum++;int i=sta[top--];
while(i!=u){
vis[i]=false;
id[i]=sum;
i=sta[top--];
}
vis[i]=false;
id[i]=sum;
}
}
bool check(){
for(int i=1;i<=n;i++)
if(id[i]==id[i+n])
return false;
return true;
}
struct llmmkk{
int v,next;
}f[M];
int h[N],fn;
void ins(int u,int v){
f[++fn].v=v;
f[fn].next=h[u];
h[u]=fn;
}
bool p[N][N];
int inq[N];
queue<int>q;
void bfs(int s){
memset(inq,0,sizeof(inq));
q.push(s);inq[s]=1;
while(!q.empty()){
int u=q.front();q.pop();p[s][u]=true;
for(int i=h[u];i;i=f[i].next){
int v=f[i].v;
if(!inq[v]) q.push(v);
}
}
}
signed main(){
n=in,m=in;
for(int i=1;i<=m;i++){
int a,b;char ta,tb;
cin>>a>>ta>>b>>tb;
insert(a+(ta=='N')*n,b+(tb=='Y')*n);
insert(b+(tb=='N')*n,a+(ta=='Y')*n);
}
for(int i=1;i<=n<<1;i++)if(!dfn[i])dfs(i);
if(check()){
for(int i=1;i<=n<<1;i++){
for(int j=head[i];j;j=e[j].next){
int v=e[j].v;
if(id[i]!=id[v])ins(id[i],id[v]);
}
}
for(int i=1;i<=n;i++){
int a=id[i],b=id[i+n];
if(!vis[a])bfs(a),vis[a]=1;
if(!vis[b])bfs(b),vis[b]=1;
if(p[a][b]) cout<<'Y';
else if(p[b][a]) cout<<'N';
else cout<<'?';
}
}
else cout<<"IMPOSSIBLE"<<'\n';
return 0;
}
题外话:
一遍过,需要对 2-sat 算法深刻理解,好题!
【BZOJ-2199】奶牛议会的更多相关文章
- [BZOJ 2199] 奶牛议会
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2199 [算法] 2-SAT [代码] #include<bits/stdc++ ...
- BZOJ 2199: [Usaco2011 Jan]奶牛议会
2199: [Usaco2011 Jan]奶牛议会 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 375 Solved: 241[Submit][S ...
- bzoj 1823: [JSOI2010]满汉全席 && bzoj 2199 : [Usaco2011 Jan]奶牛议会 2-sat
noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下. 2-sat 大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选.这之间又有一些二元关系,比如x&y=1等等... 先把 ...
- [BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT)
[BZOJ 2199] [USACO11JAN] 大陆议会The Continental Cowngress(2-SAT) 题面 题面较长,略 分析 考虑把问题转化成一个依赖性问题 我们把每只奶牛投出 ...
- C++之路进阶——bzoj2199(奶牛议会)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
- 【BZOJ2199】 [Usaco2011 Jan]奶牛议会
Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 & ...
- BZOJ2199: [Usaco2011 Jan]奶牛议会(2-SAT)
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 559 Solved: 360[Submit][Status][Discuss] Descriptio ...
- BZOJ2199[Usaco2011 Jan]奶牛议会——2-SAT+tarjan缩点
题目描述 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M ...
- BZOJ2199 奶牛议会 【2-sat】
BZOJ2199 奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以"每头牛 都可以获得自己想要的"为原则, ...
- 【BZOJ2199】[Usaco2011 Jan]奶牛议会 2-SAT
[BZOJ2199][Usaco2011 Jan]奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要 ...
随机推荐
- python中dump与dumps的区别
刚写了一个代吗,没有搞懂dump和dumps的区别,现在搞懂了,下班后在来整理import pickleq = [1,2,3,4]pickle.dump(q,open("cb1.txt&qu ...
- springboot 事务创建流程源码分析
springboot 事务创建流程源码分析 目录 springboot 事务创建流程源码分析 1. 自动加载配置 2. InfrastructureAdvisorAutoProxyCreator类 3 ...
- Anaconda配置国内镜像源
1. 为conda配置(清华)镜像源 使用conda进行安装时,访问的是国外的网络,所以下载和安装包时会特别慢.我们需要更换到国内镜像源地址,这里我更换到国内的清华大学地址.(永久添加镜像) Wind ...
- [源码解析] PyTorch 流水线并行实现 (1)--基础知识
[源码解析] PyTorch 流水线并行实现 (1)--基础知识 目录 [源码解析] PyTorch 流水线并行实现 (1)--基础知识 0x00 摘要 0x01 历史 1.1 GPipe 1.2 t ...
- 教你用ps如何将图片、文字做出模糊斑驳的作旧效果
1.对图片的图层执行滤镜-风格化-扩散,选变亮优先. 2.选择画笔工具,在画笔选项里选择喷溅59像素,画笔大小我用的是100px,大家可以根据自己的情况自定义大小,前景设置为黑色. 3.在图章图层上方 ...
- python mysql增加改查
#python mysql增加改查,方便日后copy/paste .......... 1 #encoding: UTF-8 2 import pymysql 3 # # 打开数据库连接 4 db = ...
- Python生成桌面应用
1.cd进入project所在根目录 2.pyinstaller -F demo.py --noconsole 3.自定义图标 选择ico格式图标发在project目录 4.pyinstaller - ...
- 深入浅出WPF-08.Event( 事件)02
路由事件 为了方便程序中对象之间的通信常常需要我们定义一些路由事件.使用路由事件比直接事件方便得多. 创建自定义路由事件的步骤: 1)声明并注册路由 2)为路由事件添加CLR事件包装 3)创建可以激发 ...
- 记一次Kafka服务器宕机的真实经历!!
大家好,我是冰河~~ 估计节前前祭拜服务器不灵了,年后服务器总是或多或少的出现点问题.不知是人的问题,还是风水问题.昨天下班时,跟运维小伙伴交代了好几遍:如果使用Docker安装Kafka集群的话,也 ...
- @Value竟然能玩出这么多花样
前言 对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了.spring给开发者提供了非常丰富的api,满足我们日常的工作需求. 如果想要创建bean实例,可以使用@Controll ...