pku 1270 Following Orders(拓扑排序)
2009-10-29 12:30
260 查看
单纯从复杂度来讲的话,我的算法的效率是n^26,是完全没办法接受的。但因为题目已经告诉我们最后满足条件的序列最多只有300个,所以稍微弄点剪枝,就可以省很多时间了。0ms过的。
#include <vector> #include <iostream> using namespace std; int degree[26],count,ans[20]; bool used[26]; vector<int> edges[26]; char str[1000]; bool input() { memset(used,1,sizeof(used)); memset(degree,0,sizeof(degree)); for(int i=0;i<26;i++) edges[i].clear(); count=0; if(cin.getline(str,1000)==0) return false; int index=0; while(1) { used[str[index]-'a']=false; count++; if(str[index+1]==0) break; index+=2; } cin.getline(str,1000); index=0; while(1) { edges[str[index]-'a'].push_back(str[index+2]-'a'); degree[str[index+2]-'a']++; if(str[index+3]==0) break; index+=4; } return true; } void DFS(int n) { if(n==count) { for(int i=0;i<n;i++) printf("%c",'a'+ans[i]); printf("/n"); } else { for(int i=0;i<26;i++) { if(!used[i]&°ree[i]==0) { for(int j=0;j<edges[i].size();j++) degree[edges[i][j]]--; used[i]=true; ans =i; DFS(n+1); for(int j=0;j<edges[i].size();j++) degree[edges[i][j]]++; used[i]=false; } } } } int main() { while(input()) { DFS(0); printf("/n"); } return 0; }
相关文章推荐
- poj_1270_回溯/拓扑排序
- POJ 1270 拓扑排序
- pku 1691 Painting A Board DFS 抽象建图 + 拓扑排序
- pku 3687 Labeling Balls 逆序拓扑排序
- POJ 1270 Following Orders 拓扑排序全输出
- POJ 1270 Following Orders (拓扑排序)
- (拓扑排序11.3.1)POJ 1270 Following Orders(拓扑排序: 求变量串在约束组的作用下产生的有序集)
- pku 1094 Sorting It All Out ——拓扑排序
- pku 1094(拓扑排序,多次拓扑)
- POJ 1270 Following Orders(拓扑排序:输出所有可能)
- poj 1270 拓扑排序
- pku 3687 Labeling Balls 拓扑排序
- UVA 124 & POJ 1270 Following Orders(拓扑排序)
- POJ 1270 Following Orders (拓扑排序,dfs枚举)
- poj1270 拓扑排序 (好久没写过这么详细的博客了^o^)
- poj 1270 || uva 124 Following Orders (拓扑排序)
- pop 1270 Following Orders(拓扑排序)
- POJ 1270 Following Orders 拓扑排序全输出
- pku 1270 Following Orders DFS+拓扑排序
- POJ:1270 Following Orders (全拓扑排序)