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 }