POJ 1270 Following Orders (DFS,拓扑排序,剪枝)


1
#include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 char contents[30]; 7 char ans[30]; 8 bool constraints[60][60]; 9 bool visited[30]; //记录了contents[i]是否已被访问过 10 int before[100]; 11 int n=0; 12 /************没加任何限制的,输出全排列**************/ 13 void dfs0(int num) //num记录了ans最新元素的下标。 14 { 15 if(num==n) 16 { 17 for(int i=0; i<n; i++) 18 printf("%c",ans[i]); 19 printf("\n"); 20 return; 21 } 22 for(int i=0;i<n;i++) 23 { 24 if(!visited[i]) 25 { 26 ans[num]=contents[i]; //这行 27 visited[i]=1; //这行,像这样的东西,可以写在递归调用dfs之前。也可以写在整个dfs函数最前面,刚进来的时候。只有细微差别。 28 //这题由于只传了一个num的值,所以在进入dfs前就标记好visited。否则还要多传一个值用来处理visited 29 dfs0(num+1); 30 visited[i]=0;//同上,可以写在调用完dfs之后,也可以写在整个dfs函数最后return之前的时候。当return有好几处的时候,可以选择写在调用完dfs之后。这样只要写一处就行。否则每处return都要写。 31 } 32 } 33 return; 34 } 35 /***********加上限制条件后,输出排列(即加上剪枝)**************/ 36 void dfs(int num) //num记录了ans最新元素的下标。 37 { 38 if(num==n) 39 { 40 for(int i=0; i<n; i++) 41 printf("%c",ans[i]); 42 printf("\n"); 43 return; 44 } 45 for(int i=0;i<n;i++) 46 { 47 if(!visited[i]&& !before[contents[i]-'a']) //只有indegree==0,才能让它进入ans。否则说明还有 需要在这个元素之前的元素没进入ans。 48 { 49 for(int j=0;j<n;j++) 50 { 51 if(constraints[contents[i]-'a'][contents[j]-'a']) 52 before[contents[j]-'a']--; 53 } 54 visited[i]=1; 55 ans[num]=contents[i]; 56 57 dfs(num+1); 58 59 visited[i]=0; 60 for(int j=0;j<n;j++) 61 { 62 if(constraints[contents[i]-'a'][contents[j]-'a']) 63 before[contents[j]-'a']++; 64 } 65 } 66 } 67 return; 68 } 69 int main() 70 { 71 char t,t1,t2; 72 bool flag=0; 73 while(scanf("%c",&t)!=EOF) 74 { 75 if(t>='a'&&t<='z') 76 { 77 contents[n++]=t; 78 continue; 79 } 80 else if(t==' ')continue; 81 else 82 { 83 if(flag)printf("\n"); 84 flag=1; 85 sort(contents,contents+n); 86 memset(constraints,0,sizeof(constraints)); 87 memset(visited,0,sizeof(visited)); 88 memset(before,0,sizeof(before)); 89 while(scanf("%c %c",&t1,&t2)!=EOF) 90 { 91 constraints[t1-'a'][t2-'a']=1; //constraints[i][j]=1,指i必须出现在j的前面 92 before[t2-'a']++; 93 if(getchar()=='\n')break; 94 } 95 96 dfs(0); 97 98 n=0; 99 } 100 101 } 102 return 0; 103 }

很基础的dfs。好好体会一下吧。

限制条件的处理部分,需要动脑想一下。

posted on 2012-11-26 17:01  MicZ  阅读(289)  评论(0编辑  收藏  举报