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 ...
随机推荐
- Node.js用ES6原生Promise对异步函数进行封装
Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...
- Java 异常java.lang.IllegalArgumentException: Illegal group reference
当字符串方法replaceAll()中替换字符含有特殊字符$如, String test = "<StreamingNo>abc</StreamingNo>" ...
- Lua输入输出库
1.简单模型 )1.io.write函数: 函数模型为io.write(...) )2.io.read函数: io.read(“*all”) 读取当前输入的整个文件 io.read(”*line“) ...
- 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)
安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...
- linux-系统调用
p { margin-bottom: 0.1in; line-height: 120% } ● Fork() 创建子进程. 创建单个子进程: pid_t pid; pid = fork(); if(p ...
- ios 中scrollview上面嵌套tableView,左右滑动出现数据多次刷新的问题
注意scrollView左右滑动时不要刷新数据,刚进来时一次性请求所有数据 红包纪录和房源信息可以左右滑动和点击,tableView可以上下滑动,图片部分个人信息只刷新一次. 界面布局如下
- Mac下,使用sshpass让iterm2支持多ssh登录信息保存
windows里有个Xshell非常的方便好使,因为它能保存你所有的ssh登录帐号信息.MAC下并没有xshell,有些也提供这样的功能,但效果都不好.iterm2是很好的终端,但却不能很好的支持多p ...
- 图解atime/mtime/ctime之间的区别与联系
补充:
- js 获取滚动条的高度 以及 设置滚动条的高度
//设置窗口滚动条高度 function setScrollTop(top){ if(!isNaN(top))document.body.scrollTop = top; } //取窗口滚动条高度 f ...
- Sina 新浪Ip归属地Api 很好用的,使用get请求
前言 这几天做了一个客服管理系统,需要根据游客的Ip获取他的归属地,刚开始使用了,www.ip138.com 抓取ip归属地,用这还可以,但是不显示国家:于是是找了这个新浪的Api,很不错啊 用法 1 ...