题意:

思路:

输出方案时有一个优秀的性质可以利用:

tarjan缩点之后点所属的分量编号是原图的反的拓扑序

所以只需要在两种方案内找到所属分量编号较小的那个就行了,用来满足(i,i')那个限制

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 310000
#define M 410000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int head[M],vet[M],nxt[M],flag[M],dfn[M],low[M],belong[M],stk[M],
c[M],x[M],y[M],f[M][],num[M][],q[M],b[M],a[M],
n,m,D,tot,top,ans,tim,s,id;
char ch[M]; void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void tarjan(int u)
{
flag[u]=;
stk[++top]=u;
dfn[u]=low[u]=++tim;
int e=head[u];
while(e)
{
int v=vet[e];
if(!flag[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!belong[v]) low[u]=min(low[u],low[v]);
e=nxt[e];
}
if(dfn[u]==low[u])
{
belong[u]=++id;
while(top&&stk[top]!=u)
{
belong[stk[top]]=id;
stk[top--]=;
}
stk[top--]=;
}
} int solve()
{ for(int i=;i<=s;i++) flag[i]=low[i]=dfn[i]=head[i]=belong[i]=;
tot=;
for(int i=;i<=m;i++)
if(c[x[i]]!=f[i][])
{
if(c[y[i]]==f[i][])
{
int t1=num[x[i]][f[i][]];
int t2=num[x[i]][-f[i][]-c[x[i]]];
add(t1,t2);
}
else
{
int t1=num[x[i]][f[i][]];
int t2=num[y[i]][f[i][]];
add(t1,t2);
t1=num[y[i]][-c[y[i]]-f[i][]];
t2=num[x[i]][-c[x[i]]-f[i][]];
add(t1,t2); }
} top=tim=id=; for(int i=;i<=s;i++)
if(!flag[i]) tarjan(i); for(int i=;i<=n;i++)
{
int x,y;
if(c[i]==){x=; y=;}
if(c[i]==){x=; y=;}
if(c[i]==){x=; y=;}
if(belong[num[i][x]]==belong[num[i][y]]) return ;
} for(int i=;i<=n;i++)
{
int x,y;
if(c[i]==){x=; y=;}
if(c[i]==){x=; y=;}
if(c[i]==){x=; y=;}
int t;
if(belong[num[i][x]]<belong[num[i][y]]) t=x;
else t=y;
printf("%c",'A'+t-);
}
return ;
} void dfs(int k)
{
if(ans) return;
if(k==D+)
{
if(solve()) ans=;
return;
} for(int i=;i<=;i++)
{
c[b[k]]=i;
dfs(k+);
c[b[k]]=;
}
} int main()
{ scanf("%d%d",&n,&D);
scanf("%s",ch+);
for(int i=;i<=n;i++)
{
if(ch[i]=='x') a[i]=;
else a[i]=ch[i]-'a'+;
}
D=;
for(int i=;i<=n;i++)
if(a[i]==) b[++D]=i;
for(int i=;i<=n;i++) c[i]=a[i]; s=;
for(int i=;i<=n;i++)
for(int j=;j<=;j++) num[i][j]=++s; scanf("%d",&m);
char c1[];
char c2[];
for(int i=;i<=m;i++)
{
scanf("%d%s%d%s",&x[i],&c1,&y[i],&c2);
f[i][]=c1[]-'A'+;
f[i][]=c2[]-'A'+; }
ans=;
dfs();
if(!ans) printf("-1\n");
return ;
}

【BZOJ4945&&UOJ317】游戏(2-sat,拓扑序)的更多相关文章

  1. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  2. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  3. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  4. poj3553 拓扑序+排序贪心

    题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...

  5. poj2762 强连通+拓扑序

    题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...

  6. poj1420 拓扑序

    题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...

  7. poj1270 拓扑序(DFS)

    题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...

  8. poj1128 拓扑序(DFS)

    题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出. 首先可 ...

  9. poj3687 拓扑序

    题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...

随机推荐

  1. sql*plus常用指令介紹

    sql*plus常用指令介紹 1.用set指令來設定SQL*Plus的環境參數值 格式: Set 環境參數名 環境參數值 ex:set feedback on set feedback 8.用show ...

  2. iOS9适配总结

    每年iOS升级,都会带来一些坑,这次iOS9也不例外.本文总结了微信在适配iOS9上遇到的问题和解决方案. 一.iOS9问题汇总   1. 编译问题(Bitcode) 大部分人升级到Xcode7后,首 ...

  3. iOS8之后,UITableViewRowAction实现滑动多个按钮

    #pragma mark - View lifeCycle - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = ...

  4. c#—OpenFileDialog

    OpenFileDialog是什么? OpenFileDialog是一个类,实例化此类可以设置弹出一个文件对话框.比如:我们发邮件时需要上传附件的时候,就会弹出一个让我们选择文件的对话框, 我们可以根 ...

  5. verilog $fopen 函数的小缺陷

    system task $fopen 的argument 为1.文件名字(可以包含具体的文件路径但是注意用)2.打开方式比如"r"."w"."a&qu ...

  6. redis集群监控之Redis-monitor部

    为了对以后有可能面临的redis集群监控做准备,这两天在准备这方面的事情,现在将其中的过程记录一下. 首先是“Ronney-Hua”的这篇文章对三中开源监控软件做了对比 文章地址:https://bl ...

  7. Applied Nonparametric Statistics-lec3

    Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/4 使用非参数方法的优势: 1. 对总体分布做的假设 ...

  8. Python如何查看变量在内存中的地址

    在python中可以用id()函数获取对象的内存地址. 用法: object = 1 + 2 object -- 对象

  9. HTTPS的请求与响应

    HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...

  10. [转载] C语言细节,写的非常棒!

    这篇文章主要讨论C语言细节问题.在找一份工作的时候,语言细节占的比例非常小,之前看某个贴着讨论,估计语言细节在面试中,占了10%的比重都不到,那为什么还要研究C语言的细节呢,我觉得有三个原因促使我总结 ...