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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值