POJ 1270

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;

}

  

你可能感兴趣的:(poj)