poj 1270(toposort)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JavaScript 中的事件设计
- 下一篇: 2年Java面试提问总结
