UVa 124 - Following Orders

  题目大意:给一个变量列表和变量的大小关系,输出所有的满足约束的序列。

  构建为有向图,然后就是拓扑排序,使用回溯输出所有的结果。

 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("\n");
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("\n");
88         dfs(0);    
89     }
90     return 0;
91 }
View Code

  第一次忘了给变量列表排序,结果WA了一次...

posted @ 2013-10-03 14:44  xiaobaibuhei  阅读(366)  评论(0编辑  收藏  举报