• 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
    ",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("
    ");
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    Eclipse出错
    每天学点MVC 【ExecuteStoreCommand SqlParameterCollection 中已包含 SqlParameter】
    ORA12541: TNS: 无监听程序 每天学点Oracle
    每天学点Oracle10gplSql命令
    Access中Sql语句如何运行问题
    如何网络赚钱
    每天学点Oracle10g客户端配置
    存储过程(工作随笔)审核退单
    存储过程(工作随笔)慢性病
    存储过程(工作随笔) 住院情况分析
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5749683.html
Copyright © 2020-2023  润新知