题目链接:http://poj.org/problem?id=1270

这道题其实就是求所有满足条件的topo序,我们考虑到给定的字符是确定的,也就是他们的长度都是一样的,所以为了得到所有的情况,我们可以考虑深度优先搜素和dfs解答树上的回溯。首先,我们从任何一个入度为0的点开始dfs,将这个点的入度-1,防止下一层的搜索中搜到这个点,再更新所有这个点可到达的点的入度,完成这些状态更新之后dfs解答树进入下一层搜索,直到深度值等于串长,输出topo序。回溯的过程中我们需要将之前修改的所有的状态都修改回来。读入的时候要考虑到一次性读入一行,然后进行空格的处理。

代码如下:

 #include<cstdio>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
const int maxn=;
int n,m,t;
int vis[maxn],in[maxn],e[maxn][maxn];
char s[],h[maxn],ans[maxn];
int cnt;
void init()
{
memset(vis,,sizeof(vis));
memset(in,,sizeof(vis));
memset(ans,,sizeof(ans));
memset(e,,sizeof(e));
}
void toposort(int dep)
{
if(dep==cnt)
{
printf("%s\n",ans);
return ;
}
for(int i=;i<cnt;i++)
{
if(in[i]==&&!vis[i])//只要找到入度为0而且不在topo序中的点就开始搜索,至于回溯和标记则是在递归中进行
{
vis[i]=;
ans[dep]=h[i];
for(int j=;j<cnt;j++)
if(e[i][j])in[j]--;
toposort(dep+);
vis[i]=;
for(int j=;j<cnt;j++)
if(e[i][j])in[j]++;//回溯过程
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//std::ios::sync_with_stdio(false);
while(gets(s))//一次性读取一行字符串在处理
{
cnt=;
int len=strlen(s);
map<char ,int > mp;
init();
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')//读掉空格
{
h[cnt++]=s[i];
}
}
sort(h,h+cnt);//为了保证最终的topo序是按照字典序输出的,需要给字符集排个序,这样搜索将会变得有序
for(int i=;i<cnt;i++)
{
mp[h[i]]=i;//将字符集转化成整数集
}
gets(s);
len=strlen(s);
int tmp1,tmp2;
bool flag=;//由于是成对出现的,通过对flag的翻转可以确认目前得到的是成对的第一个数还是第二个数
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(!flag)
{
flag=;
tmp1=mp[s[i]];//得到的是成对中的第一个数,并获取编号
}
else
{
tmp2=mp[s[i]];
flag=;
e[tmp1][tmp2]=;
in[tmp2]+=;
}
}
}
toposort();
printf("\n");//注意每个结果之后有一个空行
}
}

POJ1270 toposort+DFS+回溯的更多相关文章

  1. 素数环(dfs+回溯)

    题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...

  2. NOJ 1074 Hey Judge(DFS回溯)

    Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format: ...

  3. HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. HDU1016 Prime Ring Problem(DFS回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. uva 193 Graph Coloring(图染色 dfs回溯)

    Description You are to write a program that tries to find an optimal coloring for a given graph. Col ...

  7. P1074 靶形数独 dfs回溯法

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  8. 剪格子---(dfs回溯)

    如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以 ...

  9. 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯

      算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB      问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...

随机推荐

  1. annoy超平面多维近似向量查找工具

    需求:有800万的中文词向量,要查询其中任意一个词向量对应的k个与其最邻近的向量.通常情况下如果向量集比较小的话,几十万个向量(几个G这种),我们都可以用gensim的word2vec来查找,但是88 ...

  2. 部署描述符web.xml

    部署描述符应用场景 需要传递初始参数给ServletContext 有多个过滤器,并要指定调用顺序 需要更改会话超时设置 要限制资源的访问,并配置用户身份验证方式 xsi:schemaLocation ...

  3. fabric 初步实践

    在集群部署时,我们经常用到堡垒机作为跳板,堡垒机和集群的其他的用户名.密码.端口号都是不同的,fabric如何进行配置不同的用户.端口号和密码. fabric作为一种强大的运维工具,可以让部署运维轻松 ...

  4. HTC“卖身”:那些辉煌、落寞与终结

    9月21日,HTC董事会决议通过与谷歌签订合作协议书.前者专注Pixel手机设计研发人才加入谷歌,HTC知识产权非专属授权予Google使用,交易作价11亿美元.事实上,这与微软收购诺基亚不同,并非是 ...

  5. 餐厅随评系列之四:Umu日本料理(米其林二星)

    文章目录 在过去的几个月,工作和生活都极其忙碌,因此博客短暂停更了一阵子.慢慢积累下了很多素材,从近期开始恢复博客更新,不过很多内容估计得靠回忆了. 索性采取"倒叙"的方法,先从最 ...

  6. js之构造函数的理解

    在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如:   1 2 3 4 5 6 var o1 = {     p:”I’m in ...

  7. acedCommandS 实现pedit命令

    acedCommandS(RTSTR, _T("PEDIT"),                RTSTR, _T("M"),                R ...

  8. Ubuntu19.10安装OMNeT++ (omnetpp-5.6)中遇到的问题

    在官网上下载对应版本的安装包,里面有说明性的文档,先在第五章ubuntu那里配置好前期的环境,再到linux那一章,看进行安装,本文即从这里开始记录. 安装包中的文档目录为:omnetpp-5.6/d ...

  9. 关于scanf与gets的区别

    以下内容主要来源: scanf与gets读取字符串 scanf与gets函数读取字符串的区别 前两天有个同学问我scanf与gets的区别说了半天也没说出来个所以然,就搜了一下,scanf()和get ...

  10. CSS Sprite雪碧图的应用

    CSS雪碧图,即CSS Sprite,也有人叫它CSS精灵图,是一种图像拼合技术.该方法是将多个小图标和背景图像合并到一张图片上,然后利用CSS的背景定位来显示需要显示的图片部分. 雪碧图的使用场景 ...