POJ 1270 Following Orders (拓扑排序,dfs枚举)
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量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枚举)的更多相关文章
- POJ 1270 Following Orders 拓扑排序
http://poj.org/problem?id=1270 题目大意: 给你一串序列,然后再给你他们部分的大小,要求你输出他们从小到大的所有排列. 如a b f g 然后 a<b ,b< ...
- ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)
两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...
- 拓扑排序+DFS(POJ1270)
[日后练手](非解题) 拓扑排序+DFS(POJ1270) #include<stdio.h> #include<iostream> #include<cstdio> ...
- POJ 1270 Following Orders(拓扑排序)
题意: 给两行字符串,第一行为一组变量,第二行时一组约束(每个约束包含两个变量,x y 表示 x <y).输出满足约束的所有字符串序列. 思路:拓扑排序 + 深度优先搜索(DFS算法) 课本代码 ...
- poj1270Following Orders(拓扑排序+dfs回溯)
题目链接: 啊哈哈.点我点我 题意是: 第一列给出全部的字母数,第二列给出一些先后顺序. 然后按字典序最小的方式输出全部的可能性.. . 思路: 整体来说是拓扑排序.可是又非常多细节要考虑.首先要按字 ...
- POJ 1270 Following Orders
Following Orders Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4902 Accepted: 1982 ...
- POJ 2367 (裸拓扑排序)
http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- 拓扑排序-DFS
拓扑排序的DFS算法 输入:一个有向图 输出:顶点的拓扑序列 具体流程: (1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v] (2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面 (3 ...
随机推荐
- C++ Vector 动态数组
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- MyBatis用嵌套ResultMap实现一对多映射
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3959451.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 内核中读取UTC时间
记录这个知识点的原因是因为项目中需要保存充电日志,因此,趁着这个机会,深入了解一下Linux的时间系统. UTC:(Universal Time Coordinated) 协调世界时的缩写 ...
- Linux系统环境变量及命令
Linux哪些我们常用,但是用的时候想不起来,这里做一个备忘录. Linux常用的变量: PATH 决定了shell将到哪些目录中寻找命令或程序 HOME 当前用户主目录 HISTSIZE 历史记录数 ...
- Jquery显示和隐藏的4种简单方法
Html代码: <div class="topicList"> <h3><span>学习天地</span></h3> ...
- mysql数据库表格导出为excel表格
在本地数据库中操作如下: 由于excel表格的编码是GBK,所以导出时要加一个设置字符编码: select * from 某个表 into outfile 'd:/文件名.xls' CHARACTER ...
- IIS6下, web.config配置为targetFramework="4.0"时出404错误
打开IIS管理器,在"Web 服务扩展" 中 将ASP.NET v4.0设置为允许就好了.这个选项默认是禁止的.
- aspx返回json数据
JQuery.getJSON 从aspx页面返回JSON数据 . -- ::| 分类: asp.net |举报|字号 订阅 . 发送请求的WebForm1.aspx <%@ Page Langu ...
- IDEA操作GIT说明
公司的代码库从TFS升级到了GIT,我们的自动化测试代码就需要迁移到git上.操作如下: 1.安装GIT 安装完成后,在IDEA中配置git安装路径 2.在本地磁盘新建一个空目录,例如:D:\Wo ...
- [转]DataGridView绑定泛型List的种种
1.DataGridView数据绑定对比(DataTable与泛型List):当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGri ...