http://uoj.ac/problem/317

https://www.lydsy.com/JudgeOnline/problem.php?id=4945

我现在的程序uoj的额外数据通过不了,bzoj应该是原版数据所以可以过??

x不超过8个所以2^8枚举一下就可以了。每个可以选择的状态实际上只有两个所以还是2-SAT。

2-SAT的图需要满足对偶性,所以逆否连边很有用。

我之前不会这种问题怎么输出方案,输出方案的方法就是tarjan之后topsort,再对每个强连通分量决定选还是不选(把矛盾的都不选,和矛盾相反的选,具体看代码里的dfs1函数)。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
#define LL long long
const int maxn=;
int n,d,fla=,m;
char ch[maxn],ch1[],ch2[],ans[maxn];
int pos[]={};
struct node{
int id1,x,id2,y;
}a[maxn];
struct nod{
int y,next;
};nod e[maxn],e1[maxn];
int head[maxn]={},head1[maxn]={},tot=,tot1=;
int low[maxn]={},dfn[maxn]={},sta[maxn]={},bel[maxn]={},cnt=,tai=,tly=;
int de[maxn]={},op[maxn]={}; bool vis[maxn]={};
int ob[maxn]={},dd[maxn]={},co[maxn]={};
int q[maxn]={},s=,t=;
inline void init(int x,int y){
e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
}
inline void init1(int x,int y){
e1[++tot1].y=y;e1[tot1].next=head1[x];head1[x]=tot1;
}
void tarjan(int x){
sta[++tai]=x;low[x]=dfn[x]=++cnt;vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(!dfn[e[i].y]){
tarjan(e[i].y);
low[x]=min(low[x],low[e[i].y]);
}
else if(vis[e[i].y]) low[x]=min(low[x],dfn[e[i].y]);
}
if(low[x]==dfn[x]){
int w;tly++;
do{
w=sta[tai--];
bel[w]=tly;vis[w]=;
}while(w!=x);
}
}
void Check(){
memset(dfn,,sizeof(dfn));
memset(head,,sizeof(head));
tot=;cnt=;tly=;
int aa,bb,cc;
for(int i=;i<=n;i++){
aa=(ch[i]-'a')*n+i;bb=(aa+n-)%(*n)+;cc=(bb+n-)%(*n)+;
de[aa]=;de[bb]=;de[cc]=;
op[bb]=cc;op[cc]=bb;
}
for(int i=;i<=m;i++){
aa=a[i].x*n+a[i].id1;bb=a[i].y*n+a[i].id2;
if(aa==bb||de[aa])continue;
if(a[i].id1==a[i].id2||de[bb]){
init(aa,op[aa]);//aa一定到op[aa]即表明aa不能选
}
else{init(op[bb],op[aa]);init(aa,bb);}//图要对偶所以aa连bb逆否也连一下
}
for(int i=;i<=*n;i++){
if(de[i]||dfn[i])continue;
tarjan(i);
}
for(int i=;i<=*n;i++){
if(de[i])continue;
if(bel[i]==bel[op[i]])return;
ob[bel[i]]=bel[op[i]];ob[bel[op[i]]]=bel[i];
}
fla=;
}
void dfs(int x){
if(x==d+){
Check();return;
}
ch[pos[x]]='a';dfs(x+);
if(fla)return;
ch[pos[x]]='b';dfs(x+);
}
void dfs1(int x){
if(co[x]!=-)return;
co[x]=;co[ob[x]]=;
for(int i=head1[x];i;i=e1[i].next)dfs1(e1[i].y);
}
int main(){
scanf("%d%d%s%d",&n,&d,ch+,&m);
for(int i=;i<=n;i++)if(ch[i]=='x')pos[++pos[]]=i;
for(int i=;i<=m;i++){
scanf("%d%s%d%s",&a[i].id1,ch1,&a[i].id2,ch2);
a[i].x=ch1[]-'A';a[i].y=ch2[]-'A';
}
dfs();
if(!fla){
printf("-1\n");return ;
}
memset(co,-,sizeof(co));
for(int i=;i<=*n;i++){//强连通分量缩点后拓扑序
if(de[i])continue;
for(int j=head[i];j;j=e[j].next)
if(bel[e[j].y]!=bel[i]){init1(bel[e[j].y],bel[i]);++dd[bel[i]];}
}
for(int i=;i<=tly;i++)if(!dd[i])q[++t]=i;
while(s<t){
int x=q[++s];
for(int i=head1[x];i;i=e1[i].next){
--dd[e1[i].y];
if(!dd[e1[i].y])q[++t]=e1[i].y;
}
if(co[x]!=-)continue;
dfs1(ob[x]);
}
for(int i=;i<=*n;i++){if((!de[i])&&co[bel[i]]==)ans[(i-)%n]='A'+(i-)/n;}
printf("%s",ans);
return ;
}

BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序的更多相关文章

  1. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】

    有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...

  2. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

  3. BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  4. bzoj3825 NOI2017 游戏

    题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...

  5. BZOJ 1444:[JSOI2009]有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  6. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  7. P3825 [NOI2017]游戏

    题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...

  8. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  9. bzoj 5393 [HAOI2018] 反色游戏

    bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...

随机推荐

  1. 容斥原理&&莫比乌斯专题

    A题:A - Eddy's爱好   HDU - 2204 具体思路:如果是求n中,为平方数的有多少个,那么答案肯定是sqrt(n),同理,如果是三次根号的话,那么答案肯定是n的三分之一次方.然后继续按 ...

  2. E - Sudoku HDU - 5547 (搜索+暴力)

    题目链接:https://cn.vjudge.net/problem/HDU-5547 具体思路:对于每一位上,我们可以从1到4挨着去试, 具体判断这一位可不可以的时候,看当前这一位上的行和列有没有冲 ...

  3. Linux下配置镜像源

    清华大学地址: https://mirrors.tuna.tsinghua.edu.cn 选择对应ubuntu的版本 在linux下用终端敲 cd /etc/apt/source.list 把里面的内 ...

  4. 安装pywin32模块

    1.先下载pywin32对于的版本 下载地址:python for windows extensions 2.选择自己对应的版本,我的是python3.5版本 注意注意注意:此处一定要看清楚自己的py ...

  5. java基础70 负责静态的网页制作语言XML(网页知识)

    HTML:负责网页结构的CSS:负责网页的样式(美观)JavaScript:负责客户(浏览器)端与用户进行交互 1.HTML语言的特点 1.由标签组成    2.语法结构松散     3.大小写不区分 ...

  6. caffe+win7+vs2013 仅CPU环境安装

    笔者对深度学习一直充满着好奇与兴趣,之前学校都是研究图像处理的特征点方式,机器学习使用也不多,别提深度学习了. 在看了李宏毅大佬的PPT后,有了初步的认识,虽然是渣渣电脑,也想自己跑几个深度模型. 说 ...

  7. 洛谷P1120 小木棍(升级版)

    传送门啦 一道经典的搜索剪枝题,不废话,步入正题. 分析: 一.输入时手动过滤不合法的情况 二.很明显我们要枚举把哪些棍子拼接成原来的长棍,而原始长度(原来的长棍的长度)都相等,因此我们可以在 $ d ...

  8. Java @SuppressWarnings

    @SuppressWarnings() 注解以@开头可以接受参数 @SuppressWarnings("unchecked") 不受检查的警告信息应该被抑制 //: holding ...

  9. javascript数组元素的添加、删除与插入以及参数数组的使用

    1.数组元素的添加 push方法在数组的尾部添加元素: var colorArray=new Array(); colorArray.push('red','black','yellow'); //这 ...

  10. 动态规划面试题基础合集1--数学三角形,LIS , LCS, CSD

    动态规划的一般思路是分为四步,即:寻找最优子结构.递归定义最优子结构.自底向上求解最优子结构和构造最优解. 接下来我列举出几个常见的动态规划面试题进行说明. (1)数学三角形:比较简单,直接贴一个我看 ...