poj 1270(toposort)
http://poj.org/problem?id=1270
题意:给一个字符串,然后再给你一些规则,要你把所有的情况都按照字典序进行输出。
思路:很明显这肯定要用到拓扑排序,当然看到discuss里面有些人有bfs也可以做,有时候觉得搜索只要剪枝剪的好,啥都可以用搜索。
因为我也不是很会拓扑排序,所以在找这类的题来练习,增加对其的理解。我就发现了一个问题,为什么拓扑排序要构图?
其实也很简单,因为拓扑排序是对一个有向的无环图进行排序,有向指的是某个点排序后一定是出现在他的前一个点的后面。这个是一定的,所以要构图。
当然,我现在也只是浅显的理解。以后有了更深的理解会在写。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <map> 5 #define maxn 60 6 7 using namespace std; 8 9 int indegree[ maxn ]; 10 char ans[ maxn ]; 11 int graph[ maxn ][ maxn ],num; 12 char str[ maxn ]; 13 14 int cmp(const void *a,const void *b) 15 { 16 return (*(char *)a)-(*(char * )b); 17 } 18 19 void toposort(int depth) //toposort+递归. 20 { 21 if(depth == num ) 22 { 23 printf("%s\n",ans); 24 return; 25 } 26 for( int i = 0 ; i < num ; i++) 27 { 28 if(!indegree[ i ]) 29 { 30 indegree [ i ] --; 31 ans[ depth ] = str[ i ]; 32 for ( int j = 0 ; j < num ; j++ ) 33 if( graph [ i ][ j ]) 34 indegree[ j ] --; 35 toposort(depth+1); 36 indegree [ i ] ++; 37 for( int j = 0 ; j < num ; j++ ) 38 if(graph[ i ][ j ]) 39 indegree [ j ] ++; 40 } 41 } 42 } 43 44 int main() 45 { 46 // freopen("in.txt","r",stdin); 47 char inp[ maxn ]; 48 while(gets( inp )) 49 { 50 memset( graph , 0 , sizeof( graph ) ); 51 memset( str , 0 , sizeof( str ) ); 52 memset( ans , 0 , sizeof( ans ) ); 53 memset( indegree , 0 , sizeof( indegree ) ); 54 map<char,int >s; 55 int len = strlen( inp ), k = 0; 56 for( int i = 0 ; i < len ; i++ ) 57 if(inp[ i ] >='a' && inp[ i ] <= 'z') 58 str[ k++ ] = inp[i]; 59 qsort( str , k , sizeof( str[0] ) , cmp ); 60 num = k; 61 for( int i = 0 ; i < len ; i++ ) 62 s[ str[ i ] ] = i; //对点进行构图一定要在排序之后,不然会wa. 63 memset( inp , 0 , sizeof( inp ) ); 64 gets( inp ); 65 len = strlen( inp ); 66 for( int i = 0 ; i < len ; i += 4 ) 67 { 68 graph[ s[ inp[ i ] ] ][ s[ inp[ i + 2 ] ] ] = 1; 69 indegree [ s[ inp[ i + 2 ] ] ] ++; 70 } 71 toposort(0); 72 memset( inp , 0 ,sizeof( inp ) ); 73 printf("\n"); 74 } 75 return 0; 76 }
转载于:https://www.cnblogs.com/Tree-dream/p/5749683.html
poj 1270(toposort)相关推荐
- poj 1270 Following Orders
// 给出一个字母表和一些字母对(c1,c2)表示c1<c2// 求出所有满足要求的排列,并按照字典序输出 #include<iostream> //拓扑排序 + dfs#inclu ...
- 修改 html file 文字,修改input标签type=file类型的文字
Apworks框架实战 Apworks框架实战(一):Apworks到底是什么? Apworks框架实战(二):开始使用 Apworks框架实战(三):单元测试与持续集成 Apworks框架实战(四) ...
- POJ 3683 【2-sat+求一组可行解】.cpp
题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO 输入 ...
- [POJ] 3687 Labeling Balls(拓扑排序)
题目地址:http://poj.org/problem?id=3687 反向建边,即重的球指向轻的球,注意重边,然后拓扑排序.从n-->1循环,即每次从入度为0的球里面选编号大的存(包含输入的逻 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目
POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...
- POJ刷题列表——正在进行
转载自:http://blog.csdn.net/pyub153/article/details/50480333 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心 ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- poj题目详细分类及算法推荐题目
DP: 1011 NTA 简单题 1013 Great Equipment 简单题 1024 Calendar Game 简单题 ...
最新文章
- arr数组怎么取值_JS 面试之数组的几个不 low 操作
- Day10:html和css
- c语言 单词变复数_一些复数运算的C语言实现
- PHP连接MySQL数据库的几种方法
- 清溪行 ( 一作宣州清溪 )
- From NSURLConnection to NSURLSession
- python取消任务的方法_python里取消一个未曾执行的任务
- 唐努乌梁海问题的由来
- matlab 产生任意概率密度的联合分布
- [渝粤教育] 四川大学 营养与食品卫生学Ⅱ 参考 资料
- 微软因果推理的框架DoWhy github 介绍
- 产生随机数——起名神器
- 思维导图怎么画简单好看的直观技巧
- spring技巧之bean加载顺序控制
- 努比亚android11,努比亚Play开测Android11 填写基本信息即可
- http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1180
- 做好准备:独立游戏开发人员适用的 4P 营销理论
- 什么是变量,和变量的类型
- 南京大学计算机研究生复试面试题
- Ineffective mark-compacts near heap limit Allocation failed-JavaScript heap out of memory vue项目内存溢出