题目大意:给一个变量列表和变量的大小关系,输出所有的满足约束的序列。
构建为有向图,然后就是拓扑排序,使用回溯输出所有的结果。
1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 #include <map> 5 #include <algorithm> 6 #include <vector> 7 using namespace std; 8 #define N 26 9 10 map<char, int> id; 11 map<int, char> var; 12 vector<int> AdjList[N], ans; 13 int n, indegree[26]; 14 15 void newNode(char c) 16 { 17 if (!id.count(c)) 18 { 19 int t = id.size(); 20 id[c] = t; 21 var[t] = c; 22 } 23 } 24 25 void dfs(int cur) 26 { 27 if (cur == n) 28 { 29 for (int i = 0; i < n; i++) printf("%c", var[ans[i]]); 30 printf(" "); 31 return; 32 } 33 for (int i = 0; i < n; i++) 34 if (indegree[i] == 0) 35 { 36 indegree[i] = -1; 37 ans.push_back(i); 38 vector<int> vt; 39 for (int j = 0; j < AdjList[i].size(); j++) 40 { 41 int v = AdjList[i][j]; 42 vt.push_back(v); 43 indegree[v]--; 44 } 45 dfs(cur+1); 46 for (int j = 0; j < vt.size(); j++) 47 indegree[vt[j]]++; 48 ans.pop_back(); 49 indegree[i] = 0; 50 } 51 } 52 53 int main() 54 { 55 #ifdef LOCAL 56 freopen("in", "r", stdin); 57 freopen("out", "w", stdout); 58 #endif 59 char str[1000]; 60 bool first = true; 61 while (gets(str)) 62 { 63 int len = strlen(str); 64 id.clear(); 65 var.clear(); 66 vector<char> varList; 67 for (int i = 0; i < len; i++) 68 if (islower(str[i])) 69 varList.push_back(str[i]); 70 sort(varList.begin(), varList.end()); 71 for (int i = 0; i < varList.size(); i++) newNode(varList[i]); 72 n = id.size(); 73 gets(str); 74 len = strlen(str); 75 vector<int> rel; 76 for (int i = 0; i < len; i++) 77 if (islower(str[i])) 78 rel.push_back(id[str[i]]); 79 for (int i = 0; i < N; i++) indegree[i] = 0; 80 for (int i = 0; i < N; i++) AdjList[i].clear(); 81 for (int i = 0; i+1 < rel.size(); i += 2) 82 { 83 AdjList[rel[i]].push_back(rel[i+1]); 84 indegree[rel[i+1]]++; 85 } 86 if (first) first = false; 87 else printf(" "); 88 dfs(0); 89 } 90 return 0; 91 }
第一次忘了给变量列表排序,结果WA了一次...