LA 4255 UVa1423 拓扑排序
题目给出的是Sij的正负号,Sij=ai+...+aj,所以令前缀和Bi=a0+a1+..+ai,a0=0,B0=0,则有Sij=Bj-B(i-1);
由此构造出Bi的拓扑序列,只要每个拓扑序列相邻的Bi的值只相差1,那样总共只有不会超过10个Bi,最大的Bi和最小的Bi的差值的绝对值小于10,
因为ai=Bi-B(i-1),ai的绝对值就必然不超出10;
#include <stdio.h>
#include <string.h>
#define CL(x) memset(x,0,sizeof(x))
const int maxn=;
bool map[maxn][maxn];
char str[maxn*maxn];
int din[maxn];
int dou[maxn];
int c[maxn];
int topo[maxn];
int b[maxn];
int tp,n;
bool dfs(int u)
{
c[u]=-;
for(int v=;v<=n;v++)if(map[u][v]){;
if(!c[v] && !dfs(v))return false;
}
c[u]=;topo[tp--]=u;
return true;
}
bool toposort()
{
tp=n;
CL(c);
for(int u=;u<=n;u++)if(!c[u])
if(!dfs(u)) return false;
return true;
} int main()
{
int t;
scanf("%d",&t);
while(t--){
int p;
scanf("%d",&n);
scanf("%s",str);
p=;CL(din);CL(dou);CL(map);
int i;
for(i=;i<n;i++)for(int j=i+;j<=n;j++){
switch(str[p]){
case '-':map[i][j]=;
break;
case '+':map[j][i]=;
break;
case '':map[i][j]=map[j][i]=;
break;
}
p++;
}
if(toposort())
for(i=;i<=n;i++)if(topo[i]==)break;
b[topo[i]]=;
for(int j=i-;j>=;j--){
if(map[topo[j+]][topo[j]] && map[topo[j]][topo[j+]])
b[topo[j]]=b[topo[j+]];
else
b[topo[j]]=b[topo[j+]]+;
}
for(int j=i+;j<=n;j++){
if(map[topo[j]][topo[j-]] && map[topo[j-]][topo[j]])
b[topo[j]]=b[topo[j-]];
else
b[topo[j]]=b[topo[j-]]-;
}
for(i=;i<=n;i++){
if(i!=)putchar(' ');
printf("%d",b[i]-b[i-]);
}
putchar('\n');
}
return ;
}
LA 4255 UVa1423 拓扑排序的更多相关文章
- LA 4255 (拓扑排序 并查集) Guess
设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...
- uvalive 4255 Guess(拓扑排序)
算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =) 首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧 其次,由输入的(n+(n-1)+...+2+1)个符号,可 ...
- LA4255/UVa1423 Guess 拓扑排序 并查集
评分稍微有一点过分..不过这个题目确确实实很厉害,对思维训练也非常有帮助. 按照套路,我们把矩阵中的子段和化为前缀和相减的形式.题目就变成了给定一些前缀和之间的大小关系,让你构造一组可行的数据.这个东 ...
- uva1423 巧用拓扑排序
对于一个序列 a1 a2 ... an 我们可以计算出一个符号矩阵A, 其中Si,j 为 a1+...+aj 的正负号,(连加和大于0则Sij=+ 小于0 Sij=- 等于0 则Sij=0), 根据 ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
- UVALive - 4255 - Guess (拓扑排序)
Guess 题目传送:Guess 白书例题 注意拓扑排序时,,入度同一时候为0的前缀和须要赋值为同一个数(这个数能够随机取.由于前缀和是累加的,每个a的数值都仅仅和前缀和之差有关).,由于此时能够看成 ...
- D - Guess UVALive - 4255 拓扑排序
Given a sequence of integers, a1, a2, . . . , an, we define its sign matrix S such that, for 1 ≤ i ≤ ...
- BZOJ2815 拓扑排序 + LCA
https://www.lydsy.com/JudgeOnline/problem.php?id=2815 作为一个DAG图,结点之间又有这么明显的等级之分,很容易想到的是拓扑排序. 但是不管是正向的 ...
- cdoj916-方老师的分身 III 【拓扑排序】
http://acm.uestc.edu.cn/#/problem/show/916 方老师的分身 III Time Limit: 3000/1000MS (Java/Others) Memo ...
随机推荐
- 大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍
Technorati 标记: hadoop,生态圈,ecosystem,yarn,spark,入门 1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用 ...
- HDU2438 数学+三分
Turn the corner Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- C语言
HTML的学习早已落下帷幕,我们已经进入了C语言的学习,这段时间时间主要学了运算符.表达式.循环语句以及数组和字符串,感觉到了一种朦朦胧胧懂得尴尬. 运算符主要包括:算术运算符.赋值运算符.关系运算符 ...
- INotifyPropertyChanged, Interface
Data Object(class) impliment INotifyPropertyChanged; then the Object can update BindingSource. Impli ...
- 掌握Thinkphp3.2.0----自动验证
自动验证是TP在create数据的时候,自动对数据进行验证. TP提供了两种验证方式:静态验证($_validate属性----自定义的模型的)和validate()方法 1.静态验证-----$_v ...
- 【php】命名空间 和 自动加载的关系
目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- oracle中merge方法
先看SQL语句:merge into employee e using emps em on (e.emp_id=em.emp_id) when matched then update set e. ...
- windows环境,idea的Terminal每次输入git命令都要提示输入用户名,密码
打开本地的这个目录(以上图片所示) 以我本地项目为例: 项目根目录下-->.git-->config文件 找到[remote "origin"]下url,更改其为htt ...
- Ionic- Android 开发环境搭建
Ionic- Android 开发环境搭建 为时一周的IONIC ADNROID 环境终于在各种处理错误中搭建成功,以下记录下搭建过程中遇到的各种情况的处理办法. 一 首先,当然是enviroment ...