POJ 1270 -- Following Orders(Topological Sort,)


POJ 1270 -- Following Orders(Topological Sort,)
Description
Order is an important concept in mathematics and in computer science. For example, Zorn's Lemma states: ``a partially ordered set in which every chain has an upper bound contains a maximal element.'' Order is also important in reasoning about the fix-point semantics of programs.


This problem involves neither Zorn's Lemma nor fix-point semantics, but does involve order.
Given a list of variable constraints of the form x < y, you are to write a program that prints all orderings of the variables that are consistent with the constraints.


For example, given the constraints x < y and x < z there are two orderings of the variables x, y, and z that are consistent with these constraints: x y z and x z y. 
Input
The input consists of a sequence of constraint specifications. A specification consists of two lines: a list of variables on one line followed by a list of contraints on the next line. A constraint is given by a pair of variables, where x y indicates that x < y.


All variables are single character, lower-case letters. There will be at least two variables, and no more than 20 variables in a specification. There will be at least one constraint, and no more than 50 constraints in a specification. There will be at least one, and no more than 300 orderings consistent with the contraints in a specification.


Input is terminated by end-of-file. 
Output
For each constraint specification, all orderings consistent with the constraints should be printed. Orderings are printed in lexicographical (alphabetical) order, one per line.


Output for different constraint specifications is separated by a blank line. 
Sample Input
a b f g
a b b f
v w x y z
v y x v z v w v
Sample Output
abfg
abgf
agbf
gabf

wxzvy
wzxvy
xwzvy
xzwvy
zwxvy
zxwvy
http://blog.csdn.net/qq7366020/article/details/8762914
第一行给出字符串(小写字母),表示出现的字符类型
第二行是约束关系,a1 b1 a2 b2 a3 b3.....ai bi,表示ai必须在bi前面
按照字典序输出所有满足约束条件的序列

解题思路:    题目要求字典序输出,先把给出第一行字符串排序
所有的约束条件变成有向图的边,x z表示顶点x到顶点z的边
序列的情况是否跟有向图有冲突,不冲突则正确,否则舍去
用深搜把所有满足的情况都搜索一边
每次找到入度为0的顶点就开始进入下一层,存入a[len],并且把与这个顶点相连的点的入度都减1
直到搜索到的层数len等于字符串的长度,就输出a[ ]
也就是在搜索过程中融合拓扑排序的思想,直到不存在入度为0的顶点为止
剪枝:   把字符串转换成数字可以大大提高效率,如y z x 转换为 1 2 0

DFS+拓扑排序
Also check code from http://blog.csdn.net/murmured/article/details/18717137
  1. char ch1[MAX],ch2[MAX],ch3[MAX];  
  2. int n,m,zm[MAX],edge[MAX][MAX],to[MAX],visit[MAX],a[MAX];  
  3.   
  4. bool comp(char a,char b)  
  5. {  
  6.     return a<b;  
  7. }  
  8.   
  9. void DFS(int len)  
  10. {  
  11.     int i,j;  
  12.     if(len==n)   //层数等于字符串长度则输出  
  13.     {  
  14.         for(i=0;i<n;i++)  
  15.         {  
  16.             printf("%c",ch1[a[i]]);  
  17.         }  
  18.         printf("\n");  
  19.         return ;  
  20.     }  
  21.     for(i=0;i<n;i++)  
  22.     {  
  23.         if(!visit[i]&&!to[i])  
  24.         {  
  25.             for(j=0;j<n;j++)   //把与这个顶点相连的点入度减1  
  26.             {  
  27.                 if(edge[i][j]==1)  
  28.                 {  
  29.                     to[j]--;  
  30.                 }  
  31.             }  
  32.             visit[i]=1;        //标记此点访问过  
  33.             a[len]=i;  
  34.             DFS(len+1);  
  35.             for(j=0;j<n;j++)   //还原现场: 把减掉的入度加回去  
  36.             {  
  37.                 if(edge[i][j]==1)  
  38.                 {  
  39.                     to[j]++;  
  40.                 }  
  41.             }  
  42.             visit[i]=0;        //还原现场  
  43.         }  
  44.     }  
  45.     return ;  
  46. }  
  47.   
  48. int main()  
  49. {  
  50.     int i,k,pd=0;  
  51.     while(gets(ch3))  
  52.     {  
  53.         if(pd==0)  
  54.             pd=1;  
  55.         else  
  56.             printf("\n");  //测试用例之间输出空行  
  57.         gets(ch2);  
  58.         memset(zm,-1,sizeof(zm));  
  59.         memset(edge,-1,sizeof(edge));  
  60.         memset(to,0,sizeof(to));  
  61.         memset(visit,0,sizeof(visit));  
  62.         for(i=0,n=0;ch3[i]!='\0';i++)   //去除空格  
  63.         {  
  64.             if(ch3[i]==' ')  
  65.                 continue;  
  66.             ch1[n++]=ch3[i];  
  67.         }  
  68.         sort(ch1,ch1+n,comp);           //排序  
  69.         for(i=0;i<n;i++)                //字符串1处理,把字母转化成0到n-1的边  
  70.         {  
  71.             zm[ch1[i]-'a']=i;  
  72.         }  
  73.         for(i=0,k=0;ch2[i]!='\0';i+=4)  //字符串2处理,构建有向图  
  74.         {  
  75.             edge[zm[ch2[i]-'a']][zm[ch2[i+2]-'a']]=1;  
  76.             to[zm[ch2[i+2]-'a']]++;     //顶点入度+1  
  77.         }  
  78.         DFS(0);  
  79.     //    printf("\n");    这样输出空行poj可以过,UVA会WA  
  80.     }  
  81.     return 0;  
  82. }  
方法2:       利用STL库里面的next_permutation()函数,把所有的字符串全排列都找出
把符合情况的字符串输出,不符合的舍去
  1. char ch1[MAX],ch2[MAX],ch3[MAX];  
  2. int n,m,zm[MAX],edge[MAX][MAX],to[MAX],visit[MAX],a[MAX];  
  3.   
  4. bool comp(char a,char b)  
  5. {  
  6.     return a<b;  
  7. }  
  8.   
  9. int Topsort(char ch[])  
  10. {  
  11.     int i,j;  
  12.     for(i=n-1;i>0;i--)  
  13.     {  
  14.         for(j=i-1;j>=0;j--)  
  15.         {  
  16.             if(edge[zm[ch[i]-'a']][zm[ch[j]-'a']]==1)  
  17.                 return 0;  
  18.         }  
  19.     }  
  20.     return 1;  
  21. }  
  22.   
  23. int main()  
  24. {  
  25.     int i,k,pd=0;  
  26.     while(gets(ch3))  
  27.     {  
  28.         if(pd==0)  
  29.             pd=1;  
  30.         else  
  31.             printf("\n");  
  32.         gets(ch2);  
  33.         memset(zm,-1,sizeof(zm));  
  34.         memset(edge,-1,sizeof(edge));  
  35.         memset(to,0,sizeof(to));  
  36.         memset(visit,0,sizeof(visit));  
  37.         for(i=0,n=0;ch3[i]!='\0';i++)   //去空格  
  38.         {  
  39.             if(ch3[i]==' ')  
  40.                 continue;  
  41.             ch1[n++]=ch3[i];  
  42.         }  
  43.         ch1[n]='\0';  
  44.         sort(ch1,ch1+n,comp);           //排序  
  45.         for(i=0;i<n;i++)                //字符串1处理,把字母转化成0到n-1的边  
  46.         {  
  47.             zm[ch1[i]-'a']=i;  
  48.         }  
  49.         for(i=0,k=0;ch2[i]!='\0';i+=4)  //字符串2处理,构建有向图  
  50.         {  
  51.             edge[zm[ch2[i]-'a']][zm[ch2[i+2]-'a']]=1;  
  52.             to[zm[ch2[i+2]-'a']]++;  
  53.         }  
  54.         if(Topsort(ch1))              //符合限制条件则输出  
  55.             printf("%s\n",ch1);  
  56.         while(next_permutation(ch1,ch1+n))  
  57.         {  
  58.             if(Topsort(ch1))          //符合限制条件则输出  
  59.                 printf("%s\n",ch1);  
  60.         }  
  61.     //    printf("\n");  
  62.     }  
  63.     return 0;  

Read full article from 1270 -- Following Orders

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts