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