Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. class Graph {
  7.   class Vertex {
  8.   public:
  9.     map<int, double> edges;
  10.     Vertex() {}
  11.     ~Vertex() { edges.clear(); }
  12.   };
  13.  
  14.   map<int, Vertex> vertices;
  15.  
  16. public:
  17.   bool addVertex(int number);
  18.   bool addEdge(int start, int end, double weight);
  19.   bool removeEdge(int start, int end);
  20.   bool removeVertexEdges(int number);
  21.   bool removeVertex(int number);
  22.   bool weight(double &result, const vector<int> &path);
  23.  
  24.   Graph() {}
  25.   ~Graph() { vertices.clear(); }
  26. };
  27.  
  28. typedef vector<int>::const_iterator Vertex_ci;
  29. typedef map<int, double>::const_iterator Edge_ci;
  30.  
  31. typedef map<int, Graph::Vertex>::iterator Vertex_it;
  32. typedef map<int, double>::iterator Edge_it;
  33.  
  34. bool Graph::addVertex(int number) {
  35.   Vertex vertex;
  36.  
  37.   if (vertices.find(number) != vertices.end())
  38.     return false;
  39.  
  40.   vertices.insert(pair<int, Vertex>(number, vertex));
  41.   return true;
  42. }
  43.  
  44. bool Graph::addEdge(int start, int end, double weight) {
  45.   Vertex_it source_it = vertices.find(start);
  46.   Vertex_it destination_it = vertices.find(end);
  47.   bool vertices_exist_in_graph = (source_it != vertices.end() && destination_it != vertices.end());
  48.  
  49.   if (vertices_exist_in_graph) {
  50.     Vertex &source = source_it->second;
  51.     Vertex &destination = destination_it->second;
  52.  
  53.     bool edges_between_given_vertices_do_not_exist = (source.edges.find(end) == source.edges.end() && destination.edges.find(start) == destination.edges.end());
  54.  
  55.     if (edges_between_given_vertices_do_not_exist) {
  56.       source.edges.insert(pair<int, double>(end, weight));
  57.       destination.edges.insert(pair<int, double>(start, weight));
  58.  
  59.       return true;
  60.     }
  61.   }
  62.  
  63.   return false;
  64. }
  65.  
  66. bool Graph::removeEdge(int start, int end) {
  67.   Vertex_it source_it = vertices.find(start);
  68.   Vertex_it destination_it = vertices.find(end);
  69.   bool vertices_exist_in_graph = (source_it != vertices.end() && destination_it != vertices.end());
  70.  
  71.   if (vertices_exist_in_graph) {
  72.     Vertex &source = source_it->second;
  73.     Vertex &destination = destination_it->second;
  74.  
  75.     return (source.edges.erase(end) && destination.edges.erase(start));
  76.   }
  77.  
  78.   return false;
  79. }
  80.  
  81. bool Graph::removeVertexEdges(int number) {
  82.    Vertex_it vertex_it = vertices.find(number);
  83.    bool all_vertex_edges_were_removed = true;
  84.  
  85.   if (vertex_it != vertices.end()) {
  86.     Vertex &removed_vertex = vertex_it->second;
  87.  
  88.     for (Edge_it edge_it = removed_vertex.edges.begin(); edge_it != removed_vertex.edges.end(); edge_it++) {
  89.       bool result_of_removing_edge = removeEdge(number, edge_it->first);
  90.  
  91.       if (all_vertex_edges_were_removed)
  92.         all_vertex_edges_were_removed = result_of_removing_edge;
  93.     }
  94.  
  95.     return all_vertex_edges_were_removed;
  96.   }
  97.   else { return false; }
  98. }
  99.  
  100. bool Graph::removeVertex(int number) {
  101.   if (removeVertexEdges(number))
  102.     return (vertices.erase(number));
  103.   else
  104.     return false;
  105. }
  106.  
  107. bool Graph::weight(double &result, const vector<int> &path) {
  108.   double length = 0.0;
  109.   bool valid_path = (path.size() > 1);
  110.  
  111.   for (Vertex_ci previous_number = path.begin(), current_number = path.begin() + 1; current_number != path.end(); current_number++, previous_number++) {
  112.     Vertex_it current_vertex_it = vertices.find(*current_number);
  113.  
  114.     if (current_vertex_it == vertices.end()) {
  115.       valid_path = false;
  116.       break;
  117.     }
  118.     else {
  119.       Vertex &current_vertex = current_vertex_it->second;
  120.       Edge_ci edge_ci = current_vertex.edges.find(*previous_number);
  121.  
  122.       if (edge_ci != current_vertex.edges.end()) {
  123.         length += edge_ci->second;
  124.       }
  125.       else {
  126.         valid_path = false;
  127.         break;
  128.       }
  129.     }
  130.   }
  131.  
  132.   result = (valid_path) ? length : 0.0;
  133.   return valid_path;
  134. }
  135.  
  136. int main() {
  137.   Graph graph;
  138.  
  139.   graph.addVertex(11);
  140.   graph.addVertex(8);
  141.   graph.addVertex(37);
  142.  
  143.   graph.addEdge(11, 8, 4.0);
  144.   graph.addEdge(37, 8, 5.0);
  145.  
  146.   graph.removeVertex(11);
  147.  
  148.   vector<int> path;
  149.  
  150.   path.push_back(37);
  151.   path.push_back(8);
  152.  
  153.   double length;
  154.  
  155.   graph.weight(length, path);
  156.  
  157.   cout << length << endl;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement