【BZOJ4945&&UOJ317】游戏(2-sat,拓扑序)
题意:

思路:

输出方案时有一个优秀的性质可以利用:
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,拓扑序)的更多相关文章
- 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
3832: [Poi2014]Rally Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 168 Solved: ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...
- poj3553 拓扑序+排序贪心
题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...
- poj2762 强连通+拓扑序
题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...
- poj1420 拓扑序
题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...
- poj1270 拓扑序(DFS)
题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...
- poj1128 拓扑序(DFS)
题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出. 首先可 ...
- poj3687 拓扑序
题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...
随机推荐
- javaweb基础(2)_tomcat服务器配置
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- Convert HTML Entities-freecodecamp算法题目
Convert HTML Entities 1.要求 将字符串中的字符 &.<.>." (双引号), 以及 ' (单引号)转换为它们对应的 HTML 实体. 2.思路 利 ...
- 数据结构实用C语言基础
大纲: 主要介绍了C语言中的指针,内存分配,两种传参方式,typedef的简单用法 关于C语言中的指针: 指针变量也称为指针(Pointer) 例如:int* p; 则p为一个指向int类型的指针. ...
- Redis错误解决:(error) MISCONF Redis is configured to save RDB snapshots
刚开始学习使用redis数据库,在执行删除命令时,提示了我这么一个错误: 错误提示 (error) MISCONF Redis is configured to save RDB snapshots, ...
- MYSQL不能显示中文字,显示错误“ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89'”
或者建表时带上编码utf8 CREATE TABLE `students`( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( ...
- PHP分页类代码
今天为大家献上一段代码,这是一段php分页代码: <?php//创建分页类class Page { private $_all_num; ...
- 流程控制之while循环for循环
流程控制之while循环1.什么是循环 循环就是重复做某件事2.为什么要有循环 为了让计算机能够具备人重复做某件事的能力3.如何用循环 while语法: while 条件: code1 code2 c ...
- Seven Puzzle Aizu - 0121 (搜索)
7 パズル ime limit1000 ms Memory limit131072 kB OSLinux Source3rd PC Koshien, Final 7 パズルは 8 つの正方形のカードと ...
- IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库
在网站发布后,访问网站会有80004005的错误提示. 项目环境 项目基于Access数据库,server2012,文件系统为NTFS格式. 错误信息 Microsoft JETDatabase En ...
- Linux: 正则表达式
正则表达式:正规的表示法,常规的表示法(Regular Expression)正则表达式使用单个字符串来描述,匹配一系列的符合某个句发规则的字符串. 1)命令格式; grep [正则] 字符串 文件 ...