uva 124 Following Orders 拓扑排序输出全部序列
一道裸的拓扑排序,回溯输出全部序列即可。还有就是我自己太懒,最后多出了一空行结果wa了一次,还查了半天。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #define N 310 using namespace std; int g[N][N]; int ru[N]; int vis[N]; int len; char s[N],str[N]; vector <int> vec; void dfs(int now) { if(vec.size()>len-1) { for(int i=0;i<vec.size();i++){ printf("%c",vec[i]+'a'-1); } printf("\n"); return ; } int i; for(i=0;i<len;i++){ if(g[now][str[i]-'a'+1]==1 && ru[str[i]-'a'+1]!=0 ){ ru[str[i]-'a'+1]--; } } for(int j=0;j<len;j++){ if(ru[str[j]-'a'+1]==0 && vis[str[j]-'a'+1]==0){ vec.push_back(str[j]-'a'+1); vis[str[j]-'a'+1]=1; dfs(str[j]-'a'+1); vis[str[j]-'a'+1]=0; vec.pop_back(); //ru[str[j]-'a'+1]++; } } for(i=0;i<len;i++){ if(g[now][str[i]-'a'+1]==1){ ru[str[i]-'a'+1]++; } }//之前这一块没写好,即恢复路径没有做好 } int main() { int con=0; while(gets(s)){ vec.clear(); int cnt=0; for(int i=0;i<strlen(s);i++){ str[cnt]=s[i]; i++; cnt++; } sort(str,str+cnt); gets(s); memset(g,0,sizeof(g)); memset(ru,0,sizeof(ru)); memset(vis,0,sizeof(vis)); for(int i=0;i<strlen(s)-2;i+=4){ if(g[s[i]-'a'+1][s[i+2]-'a'+1]==0){ g[s[i]-'a'+1][s[i+2]-'a'+1]=1; ru[s[i+2]-'a'+1]++; } } if(con==0){ con++; } else{ printf("\n"); } len=cnt; for(int i=0;i<len;i++){ if(ru[str[i]-'a'+1]==0){ vec.push_back(str[i]-'a'+1); vis[str[i]-'a'+1]=1; dfs(str[i]-'a'+1); vis[str[i]-'a'+1]=0; vec.pop_back(); } } } return 0; }