题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量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. Redhat/Centos6.x-Samba配置

    安装: yum -y install samba samba-common samba-client 设置samba帐号 useradd smb passwd smb smbpasswd -a smb ...

  2. Codevs 2894 Txx考试

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今天 ...

  3. Linux下OpenCV的环境搭建

    OpenCV is the most popular and advanced code library for Computer Vision related applications today, ...

  4. 关于MD5加密的小知识

    - (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, ...

  5. 【风马一族_git_github】git的工作流程

    git有三个区域(如图): 基本信息设置 1)设置用户名   git config --global user.name  "帐号名" 2)设置用户名邮箱  git config ...

  6. Javascript原型链

    原型链的关系 在Javascript中,只要创建了一个新函数,就会为该函数创建prototype属性,指向函数的原型对象,Object.prototype是所有对象最顶层的原型.所有对象都继承由Obj ...

  7. python自学笔记二

    :#进入循环重输文0件名 pass else:#退出循环,等待创建 break fobj = open(fname,'a')#打开或创建文件 #接下来写入文件 all = [] print('ente ...

  8. django_auth_ldap

    使用django_auth_ldap来实现ldap和django自己的认证系统auth 下载插件 python-ldap和django_auth_ldap 配置settings.py 一些基本说明: ...

  9. jQuery对象和DOM对象的互相转换【 转】

    jQuery对象转换为dom对象 只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的 ...

  10. Mysql 创建数据库表(删除,删除,插入)

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...