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)相关推荐

  1. poj 1270 Following Orders

    // 给出一个字母表和一些字母对(c1,c2)表示c1<c2// 求出所有满足要求的排列,并按照字典序输出 #include<iostream> //拓扑排序 + dfs#inclu ...

  2. 修改 html file 文字,修改input标签type=file类型的文字

    Apworks框架实战 Apworks框架实战(一):Apworks到底是什么? Apworks框架实战(二):开始使用 Apworks框架实战(三):单元测试与持续集成 Apworks框架实战(四) ...

  3. POJ 3683 【2-sat+求一组可行解】.cpp

    题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO 输入 ...

  4. [POJ] 3687 Labeling Balls(拓扑排序)

    题目地址:http://poj.org/problem?id=3687 反向建边,即重的球指向轻的球,注意重边,然后拓扑排序.从n-->1循环,即每次从入度为0的球里面选编号大的存(包含输入的逻 ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目

    POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...

  7. POJ刷题列表——正在进行

    转载自:http://blog.csdn.net/pyub153/article/details/50480333 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心 ...

  8. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  9. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

最新文章

  1. arr数组怎么取值_JS 面试之数组的几个不 low 操作
  2. Day10:html和css
  3. c语言 单词变复数_一些复数运算的C语言实现
  4. PHP连接MySQL数据库的几种方法
  5. 清溪行 ( 一作宣州清溪 )
  6. From NSURLConnection to NSURLSession
  7. python取消任务的方法_python里取消一个未曾执行的任务
  8. 唐努乌梁海问题的由来
  9. matlab 产生任意概率密度的联合分布
  10. [渝粤教育] 四川大学 营养与食品卫生学Ⅱ 参考 资料
  11. 微软因果推理的框架DoWhy github 介绍
  12. 产生随机数——起名神器
  13. 思维导图怎么画简单好看的直观技巧
  14. spring技巧之bean加载顺序控制
  15. 努比亚android11,努比亚Play开测Android11 填写基本信息即可
  16. http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1180
  17. 做好准备:独立游戏开发人员适用的 4P 营销理论
  18. 什么是变量,和变量的类型
  19. 南京大学计算机研究生复试面试题
  20. Ineffective mark-compacts near heap limit Allocation failed-JavaScript heap out of memory vue项目内存溢出

热门文章

  1. 数据结构源码笔记(C语言):B树的相关运算算法
  2. 栈和队列的算法题总结
  3. 关闭Bind 递归查询功能
  4. 管理springmvc组件——前端控制器、控制器映射器和适配器、视图解析器、文件上传的、拦截器||消息转化
  5. 前端工程化概述||模块化相关规范
  6. Unity学习笔记4 更换编辑器为VS2013及VS的背景图片设置
  7. OpenWRT 随记
  8. 自主定义适合自己的Keil主题
  9. 定时器0工作方式1,定时1s
  10. 电磁场与电磁波第一章 矢量分析