Following Orders
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4059 | Accepted: 1623 |
Description
Order is an important concept in mathematics and in computer science. For example,Zorn's Lemma states: ``a partially ordered set in which every chain has an upper bound contains a maximal element.'' Order is also important in reasoning about the fix-point
semantics of programs.
This problem involves neither Zorn's Lemma nor fix-point semantics,but does involve order.
Given a list of variable constraints of the form x < y,you are to write a program that prints all orderings of the variables that are consistent with the constraints.
For example,given the constraints x < y and x < z there are two orderings of the variables x,y,and z that are consistent with these constraints: x y z and x z y.
This problem involves neither Zorn's Lemma nor fix-point semantics,but does involve order.
Given a list of variable constraints of the form x < y,you are to write a program that prints all orderings of the variables that are consistent with the constraints.
For example,given the constraints x < y and x < z there are two orderings of the variables x,y,and z that are consistent with these constraints: x y z and x z y.
Input
The input consists of a sequence of constraint specifications. A specification consists of two lines: a list of variables on one line followed by
a list of contraints on the next line. A constraint is given by a pair of variables,where x y indicates that x < y.
All variables are single character, lower-case letters. There will be at least two variables,and no more than 20 variables in a specification. There will be at least one constraint,and no more than 50 constraints in a specification. There will be at least one,and no more than 300 orderings consistent with the contraints in a specification.
Input is terminated by end-of-file.
All variables are single character, lower-case letters. There will be at least two variables,and no more than 20 variables in a specification. There will be at least one constraint,and no more than 50 constraints in a specification. There will be at least one,and no more than 300 orderings consistent with the contraints in a specification.
Input is terminated by end-of-file.
Output
For each constraint specification,all orderings consistent with the constraints should be printed. Orderings are printed in lexicographical (alphabetical) order,one per line.
Output for different constraint specifications is separated by a blank line.
Output for different constraint specifications is separated by a blank line.
Sample Input
a b f g
a b b f
v w x y z
v y x v z v w v
Sample Output
abfg
abgf
agbf
gabf
wxzvy
wzxvy
xwzvy
xzwvy
zwxvy
zxwvy
Source
Duke Internet Programming Contest 1993,uva 124
题意:给定1串字符(互异),再给出1个字符序列,表示1种前后关系,如a b e f c d,表示a<b,e<f,c<d。
将开始给出的字符进行排序,使之符合这个关系序列。并按字典序输出这些符合要求的字符序列。
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int N = 30;
int in[N],exist[N],mapt[N][N],path[N],n;
void topeSort(int u,int k)
{
path[k]=u;
if(k==n)
{
for(int i=1;i<=n;i++)
printf(%c,path[i]+'a');
printf(
);
return ;
}
in[u]=⑴;
for(int i=0;i<26;i++)
if(mapt[u][i])
in[i]-=mapt[u][i];
for(int i=0;i<26;i++)
if(exist[i]&&!in[i])
topeSort(i,k+1);
in[u]=0;
for(int i=0;i<26;i++)
if(mapt[u][i])
in[i]+=mapt[u][i];
}
int main()
{
int flag=0;
char str[1000];
while(gets(str))
{
if(flag)printf(
); flag=1;
memset(in,sizeof(in));
memset(exist,sizeof(exist));
memset(mapt,sizeof(mapt));
n=0;
for(int i=0;str[i]!='