【题目来源】
http://poj.org/problem?id=1270
【题目大意】
输入两行字母,第一行是字母,第二行是字母的关系。一对儿字母 A B 表示 A<B。比如,a b b f,表示a<b并且b<f 。现在要求依据输入,输出相应的所有拓扑序列,并且不能出现 b>a 和 b>f 的情况。例如:
输入样例:
a b f g
a b b f
输出样例:
abfg
abgf
agbf
gabf
【算法代码】
POJ 不支持万能头文件 #include <bits/stdc++.h>,所以使用了下面代码中的各个头文件。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n;
int a[maxn];
int G[maxn][maxn],ind[maxn],ans[maxn];
bool vis[maxn];
void topsort(int pos) {
if(pos==n) {
for(int i=0; i<n; i++)
printf("%c",ans[i]+'a');
cout<<endl;
return;
}
for(int i=0; i<n; i++) {
if(!vis[a[i]]&&!ind[a[i]]) {
vis[a[i]]=true;
ans[pos]=a[i];
for(int j=0; j<n; j++) {
if(G[a[i]][a[j]])
ind[a[j]]--;
}
topsort(pos+1);
vis[a[i]]=false;
for(int j=0; j<n; j++) {
if(G[a[i]][a[j]])
ind[a[j]]++;
}
}
}
}
int main() {
string s;
while(getline(cin,s)) {
memset(vis,false,sizeof(vis));
memset(ind,0,sizeof(ind));
memset(G,0,sizeof(G));
n=0;
for(int i=0; i<s.size(); i++) {
if(s[i]>='a'&&s[i]<='z')
a[n++]=s[i]-'a';
}
sort(a,a+n);
getline(cin,s);
int cnt=0,tmp[2];
for(int i=0; i<s.size(); i++) {
if(s[i]!=' ')
tmp[cnt++]=s[i]-'a';
if(cnt==2) {
cnt=0;
G[tmp[0]][tmp[1]]=1;
ind[tmp[1]]++;
}
}
topsort(0);
cout<<endl;
}
}
/*
in:
a b f g
a b b f
out:
abfg
abgf
agbf
gabf
in:
v w x y z
v y x v z v w v
out:
wxzvy
wzxvy
xwzvy
xzwvy
zwxvy
zxwvy
*/
【参考文献】
https://blog.csdn.net/qq_51605889/article/details/123209159