题意:

思路:

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

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. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

  2. ubuntu 16.04 连接 wifi

    我的电脑是win10+ubuntu16.04双系统.在ubuntu下无法连接wifi,一直用usb连接的手机流量,不太方便.现在来用安装无线驱动,顺便翻个墙. https://blog.csdn.ne ...

  3. cppoop作业:Inheritance+Composition 關係下的構造和析構

    Inheritance+Composition 關係下的構造和析構 哪个的ctor先被调用. 父类先于组件类调用 构造函数

  4. c内置数据类型

    参考 C与指针 第三章 类型 类型标识符 字节 表示数值范围 备注 整型 [signed] int 2* -32768~32767 -2^15 ~ (2^15 -1) 无符号整型 unsigned [ ...

  5. PHP计算今天、昨天、本周、本月、上月开始时间和结束时间

    PHP计算今天.昨天.本周.本月.上月开始时间和结束时间 $today = date('Y-m-d H:i:s',mktime(0,0,0,date('m'),date('d'),date('Y')) ...

  6. paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之onehot coding styles(index-parameter style with registered outputs)

    case语句中,对于state/next 矢量仅仅做了1-bit比较. parameter 值不是表示FSM的状态编码,而是表示state/next变量的索引.

  7. html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)

    // html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...

  8. 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案

    本文转载于 http://www.cnblogs.com/JiangLe/p/6362770.html innodb_autoinc_lock_mode这个参数控制着在向有auto_increment ...

  9. 1036: [ZJOI2008]树的统计Count(树链剖分)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 19830  Solved: 8067[Submit ...

  10. 命令行下修改postgres密码

    1. 修改PostgreSQL数据库默认用户postgres的密码 PostgreSQL数据库创建一个postgres用户作为数据库的管理员,密码随机,所以需要修改密码,方式如下: 步骤一:登录Pos ...