【uva-124】Following Orders (拓撲排序)竟然自己寫出了全排列的演算法!
阿新 • • 發佈:2018-12-16
題目大意:
第一行所有字母。
第二行兩個兩個字母是有偏序關係的。
最後輸出要是所有符合偏序關係的按字母列表順序輸出。
思路:
存好偏序關係。
從小到大存好字母元素。
先找出所有可以放在首字母的字母(沒有必須放在自身之前關係的),要注意i=j分開考慮。
用dfs尋找下一個可以排的字母。
還要注意dfs完成退後一步時要把標記找到的改成false。
基本思路沒有問題但是資料處理要很細心。
除錯了很久。
我還是……
唉一點也不成熟。
就是個巨嬰呢。
/* uva 124 by zhuhua Time limit: 3000 ms AC Time: 0 ms??? */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; bool order[30][30]; int exist[30]; int siz; int head[30]; int headsiz; int output[30]; bool used[30]; void dfs(int now,int n,int tot) { used[now]=true; if(n==tot) { for(int i=0;i<siz;i++) printf("%c",'a'+output[i]); cout<<endl; return; } else { for(int i=0;i<siz;i++) { bool cando=true; if(!used[exist[i]]) { for(int j=0;j<n;j++) { if(exist[i]!=output[j]&&order[exist[i]][output[j]]) {cando=false;break;} } if(cando) { output[n]=exist[i]; dfs(exist[i],n+1,tot); used[exist[i]]=false; } } } } } int main() { string input,ord; int cas=0; while(getline(cin,input)) { if(cas++)cout<<endl; siz=0; for(int i=0;i<input.length();i++) { if(input[i]!=' ') exist[siz++]=input[i]-'a'; } sort(exist,exist+siz); memset(order,false,sizeof(order)); getline(cin,ord); for(int i=0;i<ord.length();i=i+4) { int x=ord[i]-'a'; int y=ord[i+2]-'a'; order[x][y]=true; } bool flag; headsiz=0; for(int i=0;i<siz;i++) { flag=true; for(int j=0;j<siz;j++) { if(i==j)continue; if(order[exist[j]][exist[i]]) { flag=false; break; } } if(flag) { head[headsiz++]=exist[i]; } } for(int i=0;i<headsiz;i++) { output[0]=head[i]; dfs(head[i],1,siz); used[head[i]]=false; } } return 0; }