http://poj.org/problem?id=1270
用dep[i] 去记录 该点输出之前必须输出几个字母;递归时记得复原
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
string str;
map<char,int>mp;
char word[40];
int dep[40];
int lw;
char ans[40];
vector<int>e[30];
void dfs_topu(int cur,int num){
// printf("cyr=%d num=%d\n",cur,num);
ans[num]=word[cur];
if(num==lw-1){
for(int i=0;i<=num;i++)printf("%c",ans[i]);puts("");
return;
}
dep[cur]--;
vector<int>::iterator it;
for(it=e[cur].begin();it!=e[cur].end();it++)
dep[*it]--;
for(int i=0;i<lw;i++){
if(dep[i]==0) dfs_topu(i,num+1);
}
for(it=e[cur].begin();it!=e[cur].end();it++)
dep[*it]++;
dep[cur]++;
}
int main()
{
// freopen("in.in","r",stdin);
while(getline(cin,str)){
// cout<<str<<endl;
mp.clear();lw=0;
for(int i=0;str[i]!='\0';i++)if(str[i]!=' '){
word[lw++]=str[i];
}
sort(word,word+lw);
for(int i=0;i<lw;i++) mp[word[i]]=i;
for(int i=0;i<lw;i++) e[i].clear();
memset(dep,0,sizeof(dep));
getline(cin,str);
int a,b;
int len=str.size();
for(int i=0;i<len;i+=4){
a=mp[str[i]];
b=mp[str[i+2]];
// cout<<word[a]<<word[b]<<endl;
e[a].push_back(b);
dep[b]++;
}
// for(int i=0;i<lw;i++)
// cout<<dep[i]<<endl;
for(int i=0;i<lw;i++){
// printf("dep[i]=%d\n",i);
if(dep[i]==0){
dfs_topu(i,0);
}
}
puts("");
}
return 0;
}