题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y。

     要求:当x<y时,x排在y前面。让你输出所有满足该约束的有序集。

思路:用拓扑排序,dfs枚举即可,为简便起见,这里将字符变量转化为整型值存储。

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <algorithm> using namespace std;
int node[],num; //num为变量的个数,node存储变量对应的整型值
int edge[][]; //edge[i][j]=1表示i<j。
int into[]; //表示i的入度
//u表示此次选的是第u个变量,idx表示目前选了idx个变了,s是输出的结果字符串
void topo_dfs(int u,int idx,string s){
if(u!=-)
s+=char(node[u]+'a');
if(idx==num){
cout<<s<<endl;
return;
}
for(int i=;i<num;i++){
//选出入度为0的变量,将与它相连的点的入度-1。
if(into[node[i]]==){
into[node[i]]=-;
for(int j=;j<;j++){
if(edge[node[i]][j]){
into[j]--;
}
}
//一开始第一个参数传了node[i]。。。
topo_dfs(i,idx+,s);
//最后别忘了恢复
into[node[i]]=;
for(int j=;j<;j++){
if(edge[node[i]][j]){
into[j]++;
}
}
}
}
}
int main() {
char str1[],str2[];
int u,v,len1,len2;
while(gets(str1)){
gets(str2);
memset(edge,,sizeof(edge));
memset(into,,sizeof(into));
num=;
len1=strlen(str1);
len2=strlen(str2);
for(int i=;i<len1;i+=){
u=str1[i];
node[num++]=u-'a';
}
//这里排序,是为了之后dfs枚举的顺序按照字典顺序
sort(node,node+num); for(int i=;i<len2;i+=){
u=str2[i]-'a';
v=str2[i+]-'a';
edge[u][v]=;
into[v]++; //注意啦,这里into的下标是v,不是node数组中的索引!!!一开始dfs中into就是用的索引,导致样例一直不过。。。
}
topo_dfs(-,,"");
puts("");
}
return ;
}

POJ 1270 Following Orders (拓扑排序,dfs枚举)的更多相关文章

  1. POJ 1270 Following Orders 拓扑排序

    http://poj.org/problem?id=1270 题目大意: 给你一串序列,然后再给你他们部分的大小,要求你输出他们从小到大的所有排列. 如a b f g 然后 a<b ,b< ...

  2. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

  3. 拓扑排序+DFS(POJ1270)

    [日后练手](非解题) 拓扑排序+DFS(POJ1270) #include<stdio.h> #include<iostream> #include<cstdio> ...

  4. POJ 1270 Following Orders(拓扑排序)

    题意: 给两行字符串,第一行为一组变量,第二行时一组约束(每个约束包含两个变量,x y 表示 x <y).输出满足约束的所有字符串序列. 思路:拓扑排序 + 深度优先搜索(DFS算法) 课本代码 ...

  5. poj1270Following Orders(拓扑排序+dfs回溯)

    题目链接: 啊哈哈.点我点我 题意是: 第一列给出全部的字母数,第二列给出一些先后顺序. 然后按字典序最小的方式输出全部的可能性.. . 思路: 整体来说是拓扑排序.可是又非常多细节要考虑.首先要按字 ...

  6. POJ 1270 Following Orders

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4902   Accepted: 1982 ...

  7. POJ 2367 (裸拓扑排序)

    http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...

  8. poj 3687 Labeling Balls(拓扑排序)

    题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...

  9. 拓扑排序-DFS

    拓扑排序的DFS算法 输入:一个有向图 输出:顶点的拓扑序列 具体流程: (1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v] (2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面 (3 ...

随机推荐

  1. protected internal修饰符

    见过这样的修饰符,但是没有仔细考虑过,今天做一个小练习. 先给出一个链接,别人在网上讨论的:http://wenku.baidu.com/view/4023f65abe23482fb4da4cfe.h ...

  2. (一)使用log4net生成日志文件

    1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编译后把log4net.dll引入项目. 2 ...

  3. hive中简单介绍分区表

    所介绍内容基本上是翻译官方文档,比较肤浅,如有错误,请指正! hive中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash分区.混合分区等).分区列也不是表中的一个实际的字段,而是一个或者 ...

  4. php中使用linux命令四大步骤

    一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个):P ...

  5. FastLoad错误 — SELECT Failed. 2652

    SELECT * FROM   teradata_education. emp_fl;     在做查询时碰到2652错误.   SELECT Failed. 2652: Operation not ...

  6. java抽象类和接口详解

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...

  7. oracle 外部表

    CREATE TABLE "EXT_ENTRY_WORKFLOW" ( ), ), "CREATE_DATE" DATE, ), ), ), ), ), ), ...

  8. Javascript Array.prototype.some()

    当我们使用数组时,查找数组中包含某个特殊的项是非常常见的动作.下面例子是一个简单的实现: 01 planets = [ 02     "mercury", 03     " ...

  9. [转] c和python利用setsockopt获得端口重用

    假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用.为了实现端口的马上复用,可以选择setsockopt ...

  10. Pomodairo,番茄工作法-解刨篇

    处于“信息大爆炸”的 e 时代的我们每天必定要处理很多的事情,不管是工作.学习.生活......面对这么多的纷杂的事物我们将如何应对?如何做到有条不紊的进行?高效.轻松.愉快的完成它呢?这时一款精致的 ...