Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <algorithm>
- using namespace std;
- int posicio(string w, const vector<string>& s, int esq, int dre) {
- if (esq > dre) return -1;
- else {
- int i = (esq + dre)/2;
- if (w < s[i]) return posicio(w,s,esq,i-1);
- else if (w > s[i]) return posicio(w,s,i+1,dre);
- else return i;
- }
- }
- int index(const vector<string>& s, string w) {
- return (posicio(w, s, 0, s.size()-1));
- }
- void topological_sort(const vector<vector<int> >& g, vector<int>& pointers, const vector<string>& v1){
- int n = g.size();
- vector<int> end;
- vector<int> visited(n,false);
- priority_queue<int,vector<int>,greater<int> > q;
- for(int i = 0; i < n; ++i){
- if(pointers[i] == 0){
- q.push(i);
- }
- }
- if (q.empty()) cout << "NO VALID ORDERING" <<endl;
- else{
- while(!q.empty()){
- int u = q.top();
- q.pop();
- if(!visited[u]){
- end.push_back(u);
- visited[u] = true;
- for(int i = 0; i < g[u].size(); ++i){
- --pointers[g[u][i]];
- if (pointers[g[u][i]] == 0) q.push(g[u][i]);
- }
- }
- }
- if (end.size() == n){
- for(int i = 0; i < n; ++i){
- cout << v1[end[i]];
- }
- cout << endl;
- }
- else cout << "NO VALID ORDERING" <<endl;
- }
- }
- int main(){
- int n,m;
- while(cin >> n){
- vector<string> v1(n);
- for(int i = 0; i < n; ++i){
- cin >> v1[i];
- }
- sort(v1.begin(),v1.end());
- cin >> m;
- vector<vector<int> > g(n);
- vector<int> pointers(n,0);
- for(int i = 0; i < m; ++i){
- string s,h;
- cin >> s >> h;
- int u = index(v1,s);
- int v = index(v1,h);
- g[u].push_back(v);
- ++pointers[v];
- }
- topological_sort(g,pointers, v1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement