runnig

Partially ordered sequence

Feb 1st, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. // Topological sort:
  2. // Given a set of edges and vertices
  3. // in the form of "A<B", "B<C", "B<D" etc
  4. // returns partially ordered sequence of vertices "A<B<C<D"
  5. // C++11
  6.  
  7. #include <vector>
  8. #include <queue>
  9. #include <unordered_map>
  10. #include <string>
  11. #include <algorithm>
  12. #include <functional>
  13.  
  14. using namespace std;
  15.  
  16. typedef pair<string, string> edge_t;
  17.  
  18. vector<string> GetSorted(const vector<edge_t> &edges)   // first string < second string
  19. {
  20.     unordered_multimap<string, string> G;
  21.     unordered_map<string, int> VertexDegree;
  22.     priority_queue<string, vector<string>, greater<string> > Q;
  23.  
  24.     vector<string> res;
  25.  
  26.     for (auto it = edges.begin(); it != edges.end(); ++it)
  27.     {
  28.         const string & vertex1 = it->first;
  29.         const string & vertex2 = it->second;
  30.  
  31.         G.insert(edge_t(vertex1, vertex2));
  32.  
  33.         if (VertexDegree.find(vertex2) == VertexDegree.end())
  34.         {
  35.             VertexDegree[vertex2] = 0;         
  36.         }
  37.  
  38.         if (VertexDegree.find(vertex1) == VertexDegree.end())
  39.         {
  40.             VertexDegree[vertex1] = 0;         
  41.         }
  42.  
  43.         ++VertexDegree[vertex2];
  44.     }
  45.  
  46.     for(auto it = VertexDegree.begin(); it != VertexDegree.end(); ++it)
  47.     {
  48.         if (VertexDegree[it->first] == 0)
  49.             Q.push(it->first);
  50.     }
  51.  
  52.     while (!Q.empty())
  53.     {
  54.         string min = Q.top();
  55.         Q.pop();
  56.         res.push_back(min);
  57.  
  58.         typedef unordered_multimap<string,string>::iterator map_pos_t;
  59.         pair<map_pos_t, map_pos_t> range;
  60.  
  61.         range = G.equal_range(min);
  62.  
  63.         for (auto it = range.first; it != range.second; ++it)
  64.         {
  65.             const string & vertex = it->second;
  66.             VertexDegree[vertex] = VertexDegree[vertex] - 1;
  67.             if (VertexDegree[vertex] == 0)
  68.             {
  69.                 Q.push(vertex);
  70.             }
  71.         }
  72.     }
  73.  
  74.     return res;
  75. }
  76.  
  77. int main()
  78. {
  79.     vector<edge_t> edges;
  80.     edges.push_back(edge_t("a", "b"));
  81.     edges.push_back(edge_t("a", "c"));
  82.     edges.push_back(edge_t("b", "c"));
  83.     edges.push_back(edge_t("d", "f"));
  84.     edges.push_back(edge_t("a", "f"));
  85.  
  86.     vector<string> res = GetSorted(edges);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment