dfs输出原图所有拓扑序就行了。
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
int d[30],head[30],nc,n;
struct edge
{
int to,next;
}edge[200];
void add(int a,int b)
{
edge[nc].to=b;edge[nc].next=head[a];head[a]=nc++;
}
char ans[30];
void dfs(int k)
{
if(k==n)
{
puts(ans);
return;
}
for(int i=0;i<26;i++)
{
if(d[i]==0)
{
d[i]--;
for(int j=head[i];j!=-1;j=edge[j].next)
d[edge[j].to]--;
ans[k]=i+'a';
dfs(k+1);
d[i]++;
for(int j=head[i];j!=-1;j=edge[j].next)
d[edge[j].to]++;
}
}
}
int main()
{
char s1[100],s2[1000];
bool flag=false;
while(gets(s1))
{
if(flag)
printf("\n");
else
flag=true;
gets(s2);
memset(head,-1,sizeof(head));
memset(d,-1,sizeof(d));
nc=n=0;
for(int i=0;s1[i]!='\0';i++)
{
if(islower(s1[i]))
{
n++;
d[s1[i]-'a']=0;
}
}
for(int i=0;s2[i]!='\0';i++)
{
if(islower(s2[i]))
{
int x=s2[i]-'a';
i++;
while(!islower(s2[i]))
i++;
int y=s2[i]-'a';
add(x,y);
d[y]++;
}
}
ans[n]='\0';
dfs(0);
}
return 0;
}
浙公网安备 33010602011771号