uva 200 Rare Order (拓扑排序)
uva 200 - Rare Order (拓扑排序)
先求出大小关系的邻接矩阵,然后拓扑排序
#include <iostream> #include <vector> #include <string> #include <set> #include <queue> #include <algorithm> using namespace std; int a[30][30],degree[30]; vector <int> ans; void input(){ int s=1,d=0; string st; vector <string> v; set <int> mys; set <int>::iterator it; while(cin>>st && st!="#"){ for(int i=0;i<st.length();i++) mys.insert(st[i]-'A'); st="A"+st; d=d>=st.length()?d:st.length(); v.push_back(st); } while(s<d){ for(int i=0;i<v.size();i++){ if(i>=v.size()-1 || v[i].length()<=s || v[i+1].length()<=s ) continue; string subst1=v[i].substr(0,s),subst2=v[i+1].substr(0,s); if(subst1==subst2 && v[i][s]!=v[i+1][s]){ a[v[i][s]-'A'][v[i+1][s]-'A']=1; } } s++; } for(it=mys.begin();it!=mys.end();it++) ans.push_back(*it); } void getdegree(){ for(int i=0;i<ans.size();i++){ for(int j=0;j<ans.size();j++){ if(a[ans[i]][ans[j]]>0) degree[ans[j]]++; } } } void topsort(){ char s; queue <int> q; for(int i=0;i<ans.size();i++){ if(degree[ans[i]]==0){ q.push(ans[i]); } } while(!q.empty()){ s='A'+q.front(); q.pop(); cout<<s; for(int i=0;i<ans.size();i++){ if(a[s-'A'][ans[i]]>0){ degree[ans[i]]--; if(degree[ans[i]]==0){ q.push(ans[i]); } } } } cout<<endl; } int main(){ input(); getdegree(); topsort(); return 0; }