拓扑排序之六

//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;
}

  

posted on 2011-08-22 09:18  sysu_mjc  阅读(121)  评论(0编辑  收藏  举报

导航