拓扑排序之六
//poj 1270 Following Orders
//给出一个字母表和一些字母对(c1,c2)表示c1<c2
//求出所有满足要求的排列,并按照字典序输出
#include<iostream> //拓扑排序 + dfs
#include<algorithm>
#include<string>
using namespace std;
int data[30],side[30][30],vis[30],len,path[30],in[30];
void topo(int r)
{
if(r==len)
{
for(int i=0;i<len;++i)
cout<<char(path[i]+'a');
cout<<endl;
return;
}
//经由主函数的sort(data,data+len);再下标从小到大深搜所有可能组合,就可以按照字典序输出了
for(int i=0;i<len;++i)
if(vis[data[i]]==0&&in[data[i]]==0)
{
path[r]=data[i];
vis[data[i]]=1;
for(int j=0;j<len;++j)
if(side[data[i]][data[j]]==1)
{
in[data[j]]--;
}
topo(r+1);
vis[data[i]]=0;
for(int j=0;j<26;++j)
if(side[data[i]][data[j]]==1)
{
in[data[j]]++;
}
}
}
int main()
{
string str,ctr;
while(getline(cin,str))
{
memset(side,0,sizeof(side));
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
len=0;
for(int i=0;i<str.size();++i)
if(str[i]!=' ')
data[len++]=str[i]-'a';
sort(data,data+len);
getline(cin,ctr);
int r=0,com[2];
for(int i=0;i<ctr.size();++i)
if(ctr[i]!=' ')
{
com[r++]=ctr[i]-'a';
if(r==2)
{
side[com[0]][com[1]]=1;
in[com[1]]++; //入度
r=0;
}
}
topo(0);
cout<<endl;
}
return 0;
}