uva 200 Rare Order (拓扑排序)
2013-08-18 22:42
381 查看
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; }
相关文章推荐
- uva 200 Rare Order (拓扑排序)
- UVa:200 Rare Order(拓扑排序)
- UVA-200 Rare Order 拓扑排序
- UVa 200 Rare Order (拓扑排序)
- 【uva-200】Rare Order(拓扑排序过的第一道)
- ACM UVa 算法题 #200 - Rare Order的解法
- ACM UVa 算法题 #200 - Rare Order的解法
- UVa 200 - Rare Order
- Uva10305给任务排序(拓扑排序 板子题)
- UVA 10305 Ordering Tasks(拓扑排序的队列解法)
- uva 10305(用DFS实现拓扑排序)
- UVA - 10305 Ordering Tasks (拓扑排序)
- UVA 10305 Ordering Tasks (拓扑排序)
- Ordering Tasks From:UVA, 10305(拓扑排序)
- Uva10305 Ordering Tasks 【拓扑排序】【例题6-15】
- uva 10305 Ordering Tasks(拓扑排序)
- uva10305 拓扑排序
- UVa10305 Ordering Tasks(拓扑排序水题)
- 图论训练1A,uva4255 拓扑排序
- UVA1423Guess (dfs,bfs拓扑排序)