pku 1270 Following Orders(拓扑排序)

 单纯从复杂度来讲的话,我的算法的效率是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]&&degree[i]==0) { for(int j=0;j<edges[i].size();j++) degree[edges[i][j]]--; used[i]=true; ans[n]=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; }

你可能感兴趣的:(c,算法,vector,ini,input)