#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>
#include <climits>
#include <iterator>
using namespace std;
const int N = 26;
int g[N][N];
char a[N];
int inDegree[N], tmpDegree[N];
char topo[N];
map<char, int> m;
bool vis[N];
void dfs(int cur, int n);
int main()
{
string s;
char ch;
// map<char, int> m;
int count;
char ch2;
int t = 0;
#ifndef ONLINE_JUDGE
ifstream cin("uva_in.txt");
#endif
while (getline(cin, s)) {
//cout << s << endl;
if (t) cout << endl;
t++;
istringstream line(s);
count = 0;
memset(g, 0x00, sizeof(g));
memset(inDegree, 0x00, sizeof(inDegree));
m.clear();
while (line >> ch) {
a[count++] = ch;
//m[ch] = count++;
}
sort(a, a + count);
for (int i = 0; i < count; i++)
m[a[i]] = i;
//cout << "count:" << count << endl;
getline(cin, s);
istringstream line2(s);
while (line2 >> ch >> ch2) {
g[m[ch]][m[ch2]] = 1;
inDegree[m[ch2]]++;
}
memset(vis, false, sizeof(vis));
//copy(topo, topo + count, ostream_iterator<char>(cout, " "));
//cout << endl;
dfs(0, count);
}
return 0;
}
void dfs(int cur, int n)
{
if (cur == n) {
for (int i = 0; i < n; i++) {
cout << topo[i];
}
cout << endl;
return;
}
for (int i = 0; i < n; i++) {
if (!vis[i] && !inDegree[i]) {
topo[cur] = a[i];
vis[i] = true;
for (int j = 0; j < n; j++) {
if (g[i][j]) {
inDegree[j]--;
}
}
dfs(cur + 1, n);
for (int j = 0; j < n; j++) {
if (g[i][j]) {
inDegree[j]++;
}
}
vis[i] = false;
}
}
}
UVa124 - Following Orders
最新推荐文章于 2020-03-25 00:53:27 发布