题目大意:按字典序输出所有拓扑排序.
/*
dfs适合枚举所有组合,每次做出一个选择,到达边界,就完成了一次完整的枚举,
对选择规定某种次序及约束,就可以完成按照需求顺序的枚举;
无向图的dfs其实是dfs实现的bfs拓扑排序,每次选一个入度为零的点,进行深入;
*/
#include <iostream>
#include <cstring>
#include<string>
#include <algorithm>
#include<cstdio>
using namespace std;
int m[28][28];
int d[28],len;
char sb[28],ans[28];
void dfs(int step)
{
if (step == len )
{
printf("%s\n", ans);
return;
}
for (int i = 0; i < len; i++)
{
if (d[sb[i]-'a'] == 0)
{
d[sb[i] - 'a']--;
ans[step] = sb[i];
for (int j = 0; j < len; j++)
{
if (m[sb[i]-'a'][sb[j]-'a'])
{
d[sb[j]-'a']--;
}
}
dfs(step+1);
d[sb[i] - 'a']++;
for (int j = 0; j < len; j++)
{
if (m[sb[i]-'a'][sb[j]-'a'])
{
d[sb[j]-'a']++;
}
}
}
}
return;
}
int main()
{
string str;
while (getline(cin, str))
{
len = 0;
memset(ans, '\0', sizeof ans);
for (int i = 0; i < str.size(); i++)
{
if (isalpha(str[i]))sb[len++] = str[i];
}
sort(sb, sb + len);
//printf("%s", sb);
getline(cin,str);
memset(m, 0, sizeof m);
memset(d, 0, sizeof d);
for (int i = 0; i < str.size(); i += 4)
{
m[str[i]- 'a'][str[i+2]- 'a'] = 1;
d[str[i + 2]-'a']++;
}
dfs(0);
cout << endl;
}
return 0;
}