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