标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4436 | Accepted: 1791 |
Description
Input
Output
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
思路:拓扑排序;我们知道拓扑排序中有很多点是可以交换位置的,因为他们之间没有先后的约束,所以我们可以DFS求所有符合要求的拓扑排序输出
即可,注意要按字典序。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 char aa[100]; 9 char bb[300]; 10 int num1[100]; 11 int num2[300]; 12 int an[300]; 13 int flag[300]; 14 int dd[300]; 15 vector<int>vec[300]; 16 void top(int n,int ans,int k); 17 int main(void) 18 { 19 int i,j,k,p,q; 20 while(gets(aa)!=NULL) 21 { memset(an,0,sizeof(an)); 22 memset(flag,0,sizeof(flag)); 23 for(i=0;i<300;i++) 24 vec[i].clear(); 25 gets(bb);int ans=0; 26 for(i=0;aa[i]!=‘\0‘;i++) 27 { 28 if(aa[i]!=‘ ‘) 29 { 30 num1[ans++]=aa[i]-‘a‘; 31 } 32 }int cnt=0;sort(num1,num1+ans); 33 for(i=0;bb[i]!=‘\0‘;i++) 34 { 35 if(bb[i]!=‘ ‘) 36 { 37 num2[cnt++]=bb[i]-‘a‘; 38 } 39 } 40 for(i=0;i<cnt-1;i+=2) 41 { 42 an[num2[i+1]]++; 43 vec[num2[i]].push_back(num2[i+1]); 44 } 45 for(i=0;i<ans;i++) 46 { 47 if(an[num1[i]]==0) 48 { 49 top(num1[i],ans,0); 50 } 51 } 52 printf("\n"); 53 }return 0; 54 } 55 void top(int n,int ans,int k) 56 { dd[k]=n;int i,j; 57 if(k==ans-1) 58 { 59 for(i=0;i<ans;i++) 60 printf("%c",dd[i]+‘a‘); 61 printf("\n"); 62 return ; 63 } 64 flag[n]=1; 65 for(i=0;i<vec[n].size();i++) 66 { 67 int r=vec[n][i]; 68 an[r]--; 69 } 70 for(i=0;i<ans;i++) 71 { 72 if(!flag[num1[i]]&&an[num1[i]]==0) 73 { 74 top(num1[i],ans,k+1); 75 } 76 } 77 flag[n]=0; 78 for(i=0;i<vec[n].size();i++) 79 { 80 int r=vec[n][i]; 81 an[r]++; 82 } 83 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5300753.html