BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序
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 拓扑排序的更多相关文章
- bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...
- bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】
有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...
- BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- bzoj3825 NOI2017 游戏
题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行nn 场游戏,每场游戏使用一张地 ...
- BZOJ 1444:[JSOI2009]有趣的游戏
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- P3825 [NOI2017]游戏
题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...
- 【BZOJ4945】[Noi2017]游戏 2-SAT
[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...
- bzoj 5393 [HAOI2018] 反色游戏
bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...
随机推荐
- Rico Board.1.环境配置
1.搭建开发环境 1.解压文件 sudo tar -jvxf gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_liunx.tar.bz2 -C ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- springboot中报异常Whitelabel Error Page
开始以为是url写错了,但其实不是,然后启动application类在的包是要在最顶部,并且和pom中groupid一样 这个也没错,后来发现能访问RestController中的url,但是进不了方 ...
- xss的一个tip
其实可能不能算tip吧. 分享一下吧. unicode有四种编码方式 源文本:The &#x [Hex]:The &# [Decimal]:The \U [Hex]:\U0054\U0 ...
- Testbench学习——$fopen/$display/$fclose
昨天在用Vivado写Testbench顶层时,为了以后便于数据的存储导出分析,需要用的文件数据记录的功能,于是,下面谈谈$fopen/$display/$fclose这三者的用法. $fopen—— ...
- crond检查服务状态
代码如下: * */1 * * * /etc/init.d/ntpd status;if [ $? -ne 0 ];then /etc/init.d/ntpd start; fi
- Linux下C程序的反汇编【转】
转自:http://blog.csdn.net/u011192270/article/details/50224267 前言:本文主要介绍几种反汇编的方法. gcc gcc的完整编译过程大致为:预处理 ...
- aarch64_a2
asterisk-sounds-core-en_GB-1.5.0-2.fc26.noarch.rpm 2017-02-14 08:24 26K fedora Mirroring Project ast ...
- (一)问候 Log4j 你好
第一节: Log4j 简介 Log4j -------- log for java(java的日志) 是java主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务: 在爬虫领域,主要用 ...
- MinGW-MSYS Bundle Win32编译ffmpeg 生成DLL并加入X264模块
组件资源站点 1)MinGW-MSYS Bundle http://sourceforge.net/projects/mingwbundle/files/ 2)yasm汇编器 http://yasm. ...