题意:

思路:

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

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. 配置centos7解决 docker Failed to get D-Bus connection 报错

    在centos7的容器里面出现了一个BUG,就是serveice启动服务的时候出现报错,不能用service启动服务.[root@e13c3d3802d0 /]# service httpd star ...

  2. numpy的linspace使用详解

    文档地址: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html Parameters(参数): start ...

  3. linux常用命令(配置查看,定时任务)

    1.查看所有待挂载设备信息 fdisk -l # fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders, total sector ...

  4. java代码导出数据到Excel、js导出数据到Excel(三)

     jsp内容忽略,仅写个出发按钮:          <button style="width: 100px" onclick="expertExcel()&quo ...

  5. 利用for循环和range输出9 * 9乘法口诀表

    li = [2, 3, 4, 5, 6, 7, 8, 9, 10] for i in li: for j in range(1, i): print('{0} * {1} = {2}'.format( ...

  6. HTTP和HTTPS以及两者的区别

    HTTP:是互联网上的应用广泛的一种网络协议,是一个客户端和服务器端请求和应答的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版, ...

  7. Ubuntu 14.04 LTS 安装和配置Bochs

    Ubuntu 14.04 LTS 安装和配置Bochs       系统是:Ubuntu 14.04 LTS 64位 安装的是:bochs-2.6.8 Bochs 需要在 X11 环境下运行,因此你的 ...

  8. Leetcode 472.连接词

    连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...

  9. Frequent values(ST)

    描述 You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to ...

  10. ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined)

    靠这把上了蓝 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 megabyte ...