题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量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. SecureCRT相关设置

    Technorati 标签: SecureCRT,设置 1.  使用SecureCRT对Linux vim进行颜色设置 Linux的控制台颜色很好设置:Options ->Session Opt ...

  2. 不用Unity库,利用.NET动态代理自己实现AOP

    AOP意为面向切面的程序设计,主要表现为对不同的代码逻辑进行隔离,从而降低不同业务逻辑之间的耦合性,AOP又理解为“横切”,可以在不改变原有实现的情况下,对代码进行拦截和扩展,如果原有设计像一个瓶子, ...

  3. 【转】IL编织 借助PostSharp程序集实现AOP

    ref:   C# AOP实现方法拦截器 在写程序的时候,很多方法都加了.日志信息.比如打印方法开始,方法结束,错误信息,等等. 由于辅助性功能的代码几乎是完全相同的,这样就会令同样的代码在各个函数中 ...

  4. RHEL7 Ansible

    [root@promote tt]# rpm -iUvh http://dl.Fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch ...

  5. linux服务器git pull/push时提示输入账号密码之免除设置

    1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...

  6. php中each()与list()函数

    <?php $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');reset($fruit); ...

  7. 10大iOS开发者最喜爱的类库

    该10大iOS开发者最喜爱的库由“iOS辅导团队”成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个最好的库:1)不能投 ...

  8. UML 小结(2)- 理论理解

    什么是UML: UML是统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件密集系统进行可视化建模的一种语言. UML为面向对象开发系统的产品进行说明.可视化 ...

  9. 什么是 block

    什么是 block 1.提前准备好的一段可以执行的代码 2.block 可以当做参数传递 3.在需要的时候执行 block 4,block 中使用 self 时肯产生循环引用 block 做网络异步耗 ...

  10. How to create jar for Android Library Project

    http://stackoverflow.com/questions/17063826/how-to-create-jar-for-android-library-project This works ...