# Week 12 - Graphs- ***IULIAN*** ## Team Team name: Date: Members | Role | Name | |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| | **Facilitator** keeps track of time, assigns tasks and makes sure all the group members are heard and that decisions are agreed upon. | Taimour | | **Spokesperson** communicates group’s questions and problems to the teacher and talks to other teams; presents the group’s findings. | Iulian | | **Reflector** observes and assesses the interactions and performance among team members. Provides positive feedback and intervenes with suggestions to improve groups’ processes. | Hugo | | **Recorder** guides consensus building in the group by recording answers to questions. Collects important information and data. | Arturo | ## Activities Make sure to have the activities signed off regularly to ensure progress is tracked. Download the provided project and open it in CLion. **NOTE**: in this week you will have to reuse the code of last week. Follow the instructions given in the `main.cpp` file. ### Activity 1: Applications of graphs data organisation pathfinding algorithms computer networks modeling of structures (ex. atoms) ### Activity 2: Visualizing graphs ![](https://i.imgur.com/qwRMxes.png) ### Activity 3: Finding a path ![](https://i.imgur.com/dP0qgH9.png) The value of found is false because find_recursive is not implemented. The amount of times passed through d is 3 times (according to the function) ### Activity 4: Positive reports ```c++ bool visitor::find_recursive(const std::string &start_vertex, const string &goal) { // append start_vertex to pre order pre_visit(start_vertex); // get vertex ref from name auto& vertex = m_graph[start_vertex]; // go over the outgoing edges of the vertex for (auto& edge : vertex.edges()) { // continue traversal from the neighbour if (start_vertex == goal) return true; if (find_recursive(edge.target(), goal)) return true; } // append start_vertex to post order post_visit(start_vertex); return false; } ``` ### Activity 5: Getting lost ```c++ bool visitor::find_recursive(const std::string &start_vertex, const string &goal) { // new line for ativity 5 if (is_visited(start_vertex)) return false; // append start_vertex to pre order pre_visit(start_vertex); // get vertex ref from name auto& vertex = m_graph[start_vertex]; // go over the outgoing edges of the vertex for (auto& edge : vertex.edges()) { // continue traversal from the neighbour if (start_vertex == goal) return true; if (find_recursive(edge.target(), goal)) return true; } // append start_vertex to post order post_visit(start_vertex); return false; } ``` ### Activity 6: The limits of recursion The smallest chain at which the prgram crashes is 21650. ### Activity 7: Iterative traversal ```c++ bool visitor::find_iterative(const string &start_vertex, const string &goal) { // FIXME Activity 7 - complete the implementation - done :) // FIXME Activity 8 - make visit order consistent with recursive version // FIXME Activity 11 - keep track of the path // FIXME Activity 12 & 12 - detect cycles (void) goal; plan_vertex_visit(start_vertex); while (visits_planned()) { auto v = peek_next_visit(); pop_next_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size()-1; i >= 0; i--) { auto& edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } } } } return false; } ``` ### Activity 8: Depth-first search ```c++ bool visitor::find_iterative(const string &start_vertex, const string &goal) { // FIXME Activity 7 - complete the implementation - done :) // FIXME Activity 8 - make visit order consistent with recursive version - done :) // FIXME Activity 11 - keep track of the path // FIXME Activity 12 & 12 - detect cycles (void) goal; plan_vertex_visit(start_vertex); while (visits_planned()) { auto v = peek_next_visit(); pop_next_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size()-1; i >= 0; i--) { auto& edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } } } } return false; } ``` ```c++ void label_pre_order(graph& g, const visitor& vis) { for (size_t i = 0; i < vis.pre_order().size(); i++) { g.label_vertex(vis.pre_order().at(i), i+1); } } ``` ### Activity 9: Breadth-first search ```c++ bool visitor::find_iterative(const string &start_vertex, const string &goal) { // FIXME Activity 7 - complete the implementation - done :) // FIXME Activity 8 - make visit order consistent with recursive version - done :) // FIXME Activity 11 - keep track of the path // FIXME Activity 12 & 12 - detect cycles (void) goal; plan_vertex_visit(start_vertex); while (visits_planned()) { if (m_traversal_type == traversal_t::depth_first) { auto v = peek_next_visit(); pop_next_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size() - 1; i >= 0; i--) { auto &edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } } } // HEREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE // breadth first below in the else } else { auto v = peek_first_visit(); pop_first_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size() - 1; i >= 0; i--) { auto &edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } } } } } return false; } const string &visitor::peek_first_visit() const { return m_planned_visits.front(); } void visitor::pop_first_visit() { if (m_planned_visits.empty()) throw std::logic_error("pop_first_visit: there is no planned visit to cancel"); m_planned_visits.pop_front(); } ``` ### Activity 10: Keeping track of the path (post-visits) post_visit is already implemented in a more efficient way in my find_iterative function and works correctly there, so i don't need to call the function. ### Activity 11: Detecting cycles ```c++ bool visitor::find_iterative(const string &start_vertex, const string &goal) { // FIXME Activity 7 - complete the implementation - done :) // FIXME Activity 8 - make visit order consistent with recursive version - done :) // FIXME Activity 11 - keep track of the path - done B) // FIXME Activity 12 & 12 - detect cycles (void) goal; plan_vertex_visit(start_vertex); while (visits_planned()) { if (m_traversal_type == traversal_t::depth_first) { auto v = peek_next_visit(); pop_next_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size() - 1; i >= 0; i--) { auto &edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } // new code here else { cycle_detected(edge.target()); } } } } else { auto v = peek_first_visit(); pop_first_visit(); if (!is_visited(v)) { pre_visit(v); if (v == goal) return true; auto &vertex = m_graph[v]; for (int i = vertex.edges().size() - 1; i >= 0; i--) { auto &edge = vertex.edges().at(i); if (!is_visited(edge.target())) { plan_vertex_visit(edge.target()); } // new code here else { cycle_detected(edge.target()); } } } } } return false; } ``` ### Activity 12: Colouring cycles ```c++ void visitor::cycle_detected(const string &vertex) { m_cycle_found = true; m_cycle.insert(vertex); } ``` ![](https://i.imgur.com/RJHCV8c.png) ## Looking back ### What we've learnt We learned how to use graphs and how they function. ### What were the surprises Graphs are really fun and easy to work with. ### What problems we've encountered None, graphs are cool. ### What was or still is unclear Graphs are a very clear concept and we feel we grasped the full idea of them. ### How did the group perform? We speed run through this assignment together and co-operated in such a way that everyone understood what is going on.