poj 1270 Following Orders

// 给出一个字母表和一些字母对(c1,c2)表示c1<c2
// 求出所有满足要求的排列,并按照字典序输出

#include<iostream> //拓扑排序 + dfs
#include<algorithm>
#include<string>
using namespace std;
int dict[30],edge[30][30],vis[30],rear,path[30],in[30];
void topo_sort(int pos)
{
if(pos==rear)
{
for(int i=0;i<rear;++i)
cout<<char(path[i]+'a');
cout<<endl;
return;
}
//经由主函数的sort(dict,dict+rear);再让下标从小到大深搜所有可能组合,就可以按照字典序输出全部解了
for(int i=0;i<rear;++i)
{
if(!vis[dict[i]]&&in[dict[i]]==0) //没有访问过且入度为0
{
path[pos]=dict[i];
vis[dict[i]]=1;
for(int j=0;j<rear;++j)
{
if(edge[dict[i]][dict[j]]==1)
{
in[dict[j]]--;
}
}
topo_sort(pos+1);

vis[dict[i]]=0;
for(int j=0;j<rear;++j)
{
if(edge[dict[i]][dict[j]]==1)
{
in[dict[j]]++;
}
}
}
}
}
int main()
{
string str;
while(getline(cin,str)) //输入字母表
{
memset(edge,0,sizeof(edge));
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));

rear=0;
for(int i=0;i<str.size();++i)
if(str[i]!=' ')
dict[rear++]=str[i]-'a';
sort(dict,dict+rear);

getline(cin,str); //输入偏序字母对
int cnt=0,pair[2];
for(int i=0;i<str.size();++i)
{
if(str[i]!=' ')
{
pair[cnt++]=str[i]-'a';
if(cnt==2)
{
edge[pair[0]][pair[1]]=1;
in[pair[1]]++; //入度数加1
cnt=0;
}
}
}
topo_sort(0);
cout<<endl;
}
return 0;
}

posted on 2011-07-22 22:29  sysu_mjc  阅读(182)  评论(0编辑  收藏  举报

导航