poj1128 拓扑序(DFS)
题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出。
首先可以根据每个字母出现的位置确定每个字母的四条边,然后根据露出来的字母可以确定哪个字母在其他字母上面,所以就可以建出拓扑序的图,由于要输出所有解,所以需要 dfs 来解决,至于字典序只要按照 dfs 的遍历顺序从字母小的到字母大的就行了。
#include<stdio.h>
#include<string.h> char s[][];
int l[],r[],u[],d[];
int ma[][],id[],n,vis[],v[];
char ans[]; void get(int i,int j,int k){
if(s[i][j]!='A'+k){
int c=s[i][j]-'A';
if(!ma[k][c]){
ma[k][c]=;
id[c]++;
}
}
} void dfs(int ss,int t){
ans[t]=ss+'A';
v[ss]=;
if(t==n){
for(int i=;i<=n;++i)printf("%c",ans[i]);
printf("\n");
v[ss]=;
return;
}
int que[],cnt=;
for(int i=;i<;++i){
if(ma[ss][i])id[i]--;
if(vis[i]&&!id[i]&&!v[i])que[++cnt]=i;
}
for(int i=;i<=cnt;++i)dfs(que[i],t+);
for(int i=;i<;++i)if(ma[ss][i])id[i]++;
v[ss]=;
} int main(){
int h,w;
while(scanf("%d%d",&h,&w)!=EOF){
n=;
memset(ma,,sizeof(ma));
for(int i=;i<;++i){
l[i]=u[i]=;
r[i]=d[i]=;
id[i]=vis[i]=v[i]=;
}
for(int i=;i<=h;++i)scanf("%s",s[i]+);
for(int i=;i<=h;++i){
for(int j=;j<=w;++j){
if(s[i][j]!='.'){
int c=s[i][j]-'A';
if(!vis[c]){
vis[c]=;
n++;
}
if(i<u[c])u[c]=i;
if(i>d[c])d[c]=i;
if(j<l[c])l[c]=j;
if(j>r[c])r[c]=j;
}
}
}
for(int k=;k<;++k){
if(l[k]==)continue;
int i,j;
i=u[k];
for(j=l[k];j<=r[k];++j)get(i,j,k);
i=d[k];
for(j=l[k];j<=r[k];++j)get(i,j,k);
j=l[k];
for(i=u[k]+;i<d[k];++i)get(i,j,k);
j=r[k];
for(i=u[k]+;i<d[k];++i)get(i,j,k);
}
for(int i=;i<;++i){
if(vis[i]&&!id[i])dfs(i,);
}
}
return ;
}
poj1128 拓扑序(DFS)的更多相关文章
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...
- ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)
两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...
- poj1270 拓扑序(DFS)
题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...
- poj2762 强连通+拓扑序
题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...
- UVA10305 拓扑序
题意:给出多个任务,以及一系列任务的关系表示某个任务必须在某个任务前完成,问一个合理的任务完成顺序 拓扑序的裸题,一开始用大白书的写法,后来发现并不好用,就换了BFS又A了一遍. 原: #includ ...
- codevs1304 拓扑序计数
题目描述 Description 求一颗有根树/树形图的拓扑序个数. 输入描述 Input Description ...
- 拓扑序+dp Codeforces Round #374 (Div. 2) C
http://codeforces.com/contest/721/problem/C 题目大意:给你有向路,每条路都有一个权值t,你从1走到n,最多花费不能超过T,问在T时间内最多能访问多少城市? ...
- bzoj5280/luogu4376 MilkingOrder (二分答案+拓扑序)
二分答案建图,然后判环,就可以了. 字典序输出的话,只要做拓扑序的时候用优先队列来维护就可以了. (其实判环也可以用拓扑序...) #include<cstdio> #include< ...
- [ARC083F] Collecting Balls [建二分图+环套树定向+建拓扑图+树的拓扑序计数]
题面 [传送门](https://arc083.contest.atcoder.jp/tasks/arc083_d) 思路 这是一道真正的好题 第一步:转化模型 行列支配类的问题,常见做法就是把行和列 ...
随机推荐
- (转载)Htmlparser Filter 简要归纳
1 . 逻辑关系:与或非 AndFilter() Creates a new instance of an AndFilter. AndFilter(NodeFilter[] pr ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
- SharePoint 2013 开发——构建工作流开发环境
博客地址:http://blog.csdn.net/FoxDave 本篇我们来讲述一下如何搭建SharePoint 2013工作流开发环境. Windows Azure Workflow作为单独的可下 ...
- stm32启动文件 startup_stm32f10x_hd.s
;* 文件名 : startup_stm32f10x_hd.s;* 库版本 : V3.5.0;* 说明: 此文件为STM32F10x高密度 ...
- hdu 2096
PS:做不出前面几道题...很不爽..扒拉了几下找了简单题来做.... #include "stdio.h" int cal(int a); int main(){ int a,b ...
- linux添加动态库搜索路径
在有时运行程序出现动态库找不着的问题,而明明装了的.这时候可能是没有将相应的路径添加到系统中去. 具体说:cd /etc/ld.so.conf.d/ 可以发现里面有一堆*.conf的文件 我们要做的就 ...
- IP地址 子网掩码 默认网关 网络地址 广播地址
“IP地址”是“TCP/IP”(Transmite Control Protocol 传输控制协议/Internet Protocol网际协议)里其中的一种协议. Internet之所以能将广阔范围内 ...
- oracle的存储结构
表空间 当一个用户被创建以后,随之就要为用户分配数据存储的空间,这在oracle中成为“表空间”(Tablespace). 在数据库中创建用户时,基于应用性能和管理的考虑,最好为不同的用户创建独立的表 ...
- “Compiled” Python files
To speed up loading modules, Python caches the compiled version of each module in the __pycache__ di ...
- Android消息推送
1.引言 所谓的消息推送就是从服务器端向移动终端发送连接,传输一定的信息.比如一些新闻客户端,每隔一段时间收到一条或者多条通知,这就是从服务器端传来的推送消息:还比如常用的一些IM软件如微信.GTal ...