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函数)。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<iostream>
  6. using namespace std;
  7. #define LL long long
  8. const int maxn=;
  9. int n,d,fla=,m;
  10. char ch[maxn],ch1[],ch2[],ans[maxn];
  11. int pos[]={};
  12. struct node{
  13. int id1,x,id2,y;
  14. }a[maxn];
  15. struct nod{
  16. int y,next;
  17. };nod e[maxn],e1[maxn];
  18. int head[maxn]={},head1[maxn]={},tot=,tot1=;
  19. int low[maxn]={},dfn[maxn]={},sta[maxn]={},bel[maxn]={},cnt=,tai=,tly=;
  20. int de[maxn]={},op[maxn]={}; bool vis[maxn]={};
  21. int ob[maxn]={},dd[maxn]={},co[maxn]={};
  22. int q[maxn]={},s=,t=;
  23. inline void init(int x,int y){
  24. e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
  25. }
  26. inline void init1(int x,int y){
  27. e1[++tot1].y=y;e1[tot1].next=head1[x];head1[x]=tot1;
  28. }
  29. void tarjan(int x){
  30. sta[++tai]=x;low[x]=dfn[x]=++cnt;vis[x]=;
  31. for(int i=head[x];i;i=e[i].next){
  32. if(!dfn[e[i].y]){
  33. tarjan(e[i].y);
  34. low[x]=min(low[x],low[e[i].y]);
  35. }
  36. else if(vis[e[i].y]) low[x]=min(low[x],dfn[e[i].y]);
  37. }
  38. if(low[x]==dfn[x]){
  39. int w;tly++;
  40. do{
  41. w=sta[tai--];
  42. bel[w]=tly;vis[w]=;
  43. }while(w!=x);
  44. }
  45. }
  46. void Check(){
  47. memset(dfn,,sizeof(dfn));
  48. memset(head,,sizeof(head));
  49. tot=;cnt=;tly=;
  50. int aa,bb,cc;
  51. for(int i=;i<=n;i++){
  52. aa=(ch[i]-'a')*n+i;bb=(aa+n-)%(*n)+;cc=(bb+n-)%(*n)+;
  53. de[aa]=;de[bb]=;de[cc]=;
  54. op[bb]=cc;op[cc]=bb;
  55. }
  56. for(int i=;i<=m;i++){
  57. aa=a[i].x*n+a[i].id1;bb=a[i].y*n+a[i].id2;
  58. if(aa==bb||de[aa])continue;
  59. if(a[i].id1==a[i].id2||de[bb]){
  60. init(aa,op[aa]);//aa一定到op[aa]即表明aa不能选
  61. }
  62. else{init(op[bb],op[aa]);init(aa,bb);}//图要对偶所以aa连bb逆否也连一下
  63. }
  64. for(int i=;i<=*n;i++){
  65. if(de[i]||dfn[i])continue;
  66. tarjan(i);
  67. }
  68. for(int i=;i<=*n;i++){
  69. if(de[i])continue;
  70. if(bel[i]==bel[op[i]])return;
  71. ob[bel[i]]=bel[op[i]];ob[bel[op[i]]]=bel[i];
  72. }
  73. fla=;
  74. }
  75. void dfs(int x){
  76. if(x==d+){
  77. Check();return;
  78. }
  79. ch[pos[x]]='a';dfs(x+);
  80. if(fla)return;
  81. ch[pos[x]]='b';dfs(x+);
  82. }
  83. void dfs1(int x){
  84. if(co[x]!=-)return;
  85. co[x]=;co[ob[x]]=;
  86. for(int i=head1[x];i;i=e1[i].next)dfs1(e1[i].y);
  87. }
  88. int main(){
  89. scanf("%d%d%s%d",&n,&d,ch+,&m);
  90. for(int i=;i<=n;i++)if(ch[i]=='x')pos[++pos[]]=i;
  91. for(int i=;i<=m;i++){
  92. scanf("%d%s%d%s",&a[i].id1,ch1,&a[i].id2,ch2);
  93. a[i].x=ch1[]-'A';a[i].y=ch2[]-'A';
  94. }
  95. dfs();
  96. if(!fla){
  97. printf("-1\n");return ;
  98. }
  99. memset(co,-,sizeof(co));
  100. for(int i=;i<=*n;i++){//强连通分量缩点后拓扑序
  101. if(de[i])continue;
  102. for(int j=head[i];j;j=e[j].next)
  103. if(bel[e[j].y]!=bel[i]){init1(bel[e[j].y],bel[i]);++dd[bel[i]];}
  104. }
  105. for(int i=;i<=tly;i++)if(!dd[i])q[++t]=i;
  106. while(s<t){
  107. int x=q[++s];
  108. for(int i=head1[x];i;i=e1[i].next){
  109. --dd[e1[i].y];
  110. if(!dd[e1[i].y])q[++t]=e1[i].y;
  111. }
  112. if(co[x]!=-)continue;
  113. dfs1(ob[x]);
  114. }
  115. for(int i=;i<=*n;i++){if((!de[i])&&co[bel[i]]==)ans[(i-)%n]='A'+(i-)/n;}
  116. printf("%s",ans);
  117. return ;
  118. }

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. Rico Board.1.环境配置

    1.搭建开发环境 1.解压文件 sudo tar -jvxf gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_liunx.tar.bz2 -C ...

  2. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  3. springboot中报异常Whitelabel Error Page

    开始以为是url写错了,但其实不是,然后启动application类在的包是要在最顶部,并且和pom中groupid一样 这个也没错,后来发现能访问RestController中的url,但是进不了方 ...

  4. xss的一个tip

    其实可能不能算tip吧. 分享一下吧. unicode有四种编码方式 源文本:The &#x [Hex]:The &# [Decimal]:The \U [Hex]:\U0054\U0 ...

  5. Testbench学习——$fopen/$display/$fclose

    昨天在用Vivado写Testbench顶层时,为了以后便于数据的存储导出分析,需要用的文件数据记录的功能,于是,下面谈谈$fopen/$display/$fclose这三者的用法. $fopen—— ...

  6. crond检查服务状态

    代码如下: * */1 * * * /etc/init.d/ntpd status;if [ $? -ne 0 ];then /etc/init.d/ntpd start; fi

  7. Linux下C程序的反汇编【转】

    转自:http://blog.csdn.net/u011192270/article/details/50224267 前言:本文主要介绍几种反汇编的方法. gcc gcc的完整编译过程大致为:预处理 ...

  8. aarch64_a2

    asterisk-sounds-core-en_GB-1.5.0-2.fc26.noarch.rpm 2017-02-14 08:24 26K fedora Mirroring Project ast ...

  9. (一)问候 Log4j 你好

    第一节: Log4j 简介 Log4j -------- log for java(java的日志) 是java主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务: 在爬虫领域,主要用 ...

  10. MinGW-MSYS Bundle Win32编译ffmpeg 生成DLL并加入X264模块

    组件资源站点 1)MinGW-MSYS Bundle http://sourceforge.net/projects/mingwbundle/files/ 2)yasm汇编器 http://yasm. ...