deushiro

arc

Mar 26th, 2021
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1.  
  2. #ifndef HOMEWORK_1_ARCGRAPH_H
  3. #define HOMEWORK_1_ARCGRAPH_H
  4.  
  5. #include "../graph.h"
  6.  
  7. template<typename T = void>
  8. class ArcGraph : public IGraph<T> {
  9. public:
  10.     virtual void AddEdge(int from, int to, T &&element) {
  11.         edges.push_back({from, to, std::move(element)});
  12.         vertexes.insert(from);
  13.         vertexes.insert(to);
  14.     };
  15.  
  16.     ArcGraph() {
  17.         edges = std::vector<std::tuple<int, int, T>>();
  18.     };
  19.  
  20.     virtual void GetEdges(std::vector<std::tuple<int, int, T>>& _edges) const {
  21.         _edges = edges;
  22.     }
  23.  
  24.     ArcGraph(IGraph<T> *_oth) {
  25.         std::vector<std::tuple<int, int, T>> _edges;
  26.         _oth->GetEdges(_edges);
  27.         edges = _edges;
  28.     };
  29.  
  30.     virtual int VerticesCount() const { return static_cast<int>(vertexes.size()); };
  31.  
  32.     virtual void GetNextVertices(int vertex, std::vector<int> &vertices) const {
  33.         for(std::tuple<int, int, T> edge : edges){
  34.             if(std::get<0>(edge) == vertex){
  35.                 vertices.push_back(std::get<1>(edge));
  36.             }
  37.         }
  38.     };
  39.  
  40.     virtual void GetPrevVertices(int vertex, std::vector<int> &vertices) const {
  41.         for(std::tuple<int, int, T> edge : edges){
  42.             if(std::get<1>(edge) == vertex){
  43.                 vertices.push_back(std::get<0>(edge));
  44.             }
  45.         }
  46.     };
  47.  
  48.     virtual void DeepFirstSearch(int vertex, std::vector<int> &vertices) const {
  49.         std::vector<bool> used(VerticesCount(), false);
  50.         std::vector<std::map<int, T>> graph(VerticesCount());
  51.         for(std::tuple<int, int, T> t : edges){
  52.             graph[std::get<0>(t)][std::get<1>(t)] = std::get<2>(t);
  53.         }
  54.         _dfs(vertex, vertices, used, graph);
  55.  
  56.     };
  57.  
  58.     virtual void BreadthFirstSearch(int vertex, std::vector<int> &vertices) const {
  59.         std::vector<bool> used(VerticesCount(), false);
  60.         int maxi = 0;
  61.         for(int i = 0; i < edges.size(); ++i){
  62.             maxi = std::max(std::get<0>(edges[i]), std::get<1>(edges[i])) + 1;
  63.         }
  64.         std::vector<std::map<int, T>> graph(maxi);
  65.         for(std::tuple<int, int, T> t : edges){
  66.             graph[std::get<0>(t)][std::get<1>(t)] = std::get<2>(t);
  67.         }
  68.         std::queue<int> order;
  69.         used[vertex] = true;
  70.         vertices.push_back(vertex);
  71.         order.push(vertex);
  72.         int current = 0;
  73.         while(!order.empty()){
  74.             current = order.front();
  75.             order.pop();
  76.             for(std::pair<int, T> t : graph[current]){
  77.                 if(!used[t.first]){
  78.                     vertices.push_back(t.first);
  79.                     order.push(t.first);
  80.                 }
  81.             }
  82.         }
  83.     };
  84.  
  85. protected:
  86.     std::vector<std::tuple<int, int, T>> edges;
  87.     std::set<int> vertexes;
  88.  
  89.     void _dfs(int vertex, std::vector<int> &vertices, std::vector<bool> &used,
  90.                       std::vector<std::map<int, T>>& graph) const {
  91.         used[vertex] = true;
  92.         vertices.push_back(vertex);
  93.         for(size_t i = 0; i < VerticesCount(); ++i){
  94.             if(!used[i]){
  95.                 _dfs(vertex, vertices, used, graph);
  96.             }
  97.         }
  98.     }
  99. };
  100.  
  101. #endif HOMEWORK_1_ARCGRAPH_H
  102.  
Add Comment
Please, Sign In to add comment