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

浙公网安备 33010602011771号