Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. //
  2. // Created by Ben Napier on 08/03/2019.
  3. //
  4. #include <iostream>
  5. #include "Graph.h"
  6.  
  7. int main() {
  8. // Lets implement a bit of Prim's...
  9. // First set up our graph.
  10. Graph graph;
  11. graph.AddNodesFrom({0,1,2,3,4,5});
  12. graph.AddEdgesToNode(0, {{1, 3}, {4, 1}, {3, 6}}, false);
  13. graph.AddEdgesToNode(1, {{0, 3}, {4, 5}, {2, 3}}, false);
  14. graph.AddEdgesToNode(2, {{1, 3}, {4, 6}, {5, 6}}, false);
  15. graph.AddEdgesToNode(3, {{0, 6}, {4, 5}, {5, 2}}, false);
  16. graph.AddEdgesToNode(4, {{1, 5}, {2, 6}, {0, 1}, {3, 5}, {5 ,4}}, false);
  17. graph.AddEdgesToNode(5, {{2, 6}, {4, 4}, {3, 2}}, false);
  18. // Ok now Prim's
  19. // We need a list of discovered nodes to ensure we don't have any cycles (N = E - 1)
  20. // Getting the smallest node as the starting point.
  21. int minimum_node = graph.GetNodesData()[0];
  22. for (int i = 1; i < graph.GetNodesData().size(); ++i) {
  23. if (graph.GetNodesData()[i] < minimum_node) {
  24. minimum_node = graph.GetNodesData()[i];
  25. }
  26. }
  27. // Now performing Prim's, we will have to run this n-1 times.
  28. Graph minimum_spanning_tree;
  29. minimum_spanning_tree.AddNode(minimum_node);
  30. std::vector<std::tuple<int, Edge>> edge_vector;
  31. std::vector<std::tuple<int, Edge>> temp;
  32. for (int i = 0; i < graph.GetNodesData().size() - 1; ++i) {
  33. edge_vector = std::vector<std::tuple<int, Edge>>();
  34. temp = std::vector<std::tuple<int, Edge>>();
  35. for (auto node : minimum_spanning_tree.GetNodesData()) {
  36. for (auto edge : graph.Neighbours(node)) {
  37. edge_vector.emplace_back(node, edge);
  38. }
  39. }
  40. for (auto edge : edge_vector) {
  41. bool cycle = false;
  42. for (auto node : minimum_spanning_tree.GetNodesData()) {
  43. if (std::get<1>(edge).to == node) {
  44. cycle = true;
  45. break;
  46. }
  47. }
  48. if (!cycle) {
  49. temp.push_back(edge);
  50. }
  51. }
  52. std::tuple<int, Edge> minimum_edge = temp[0];
  53. for (int j = 1; j < temp.size(); ++j) {
  54. if (std::get<1>(temp[j]).weight < std::get<1>(minimum_edge).weight) {
  55. minimum_edge = temp[j];
  56. }
  57. }
  58. minimum_spanning_tree.AddNode(std::get<1>(minimum_edge).to);
  59. minimum_spanning_tree.AddEdge(std::get<0>(minimum_edge),
  60. std::get<1>(minimum_edge).to,
  61. std::get<1>(minimum_edge).weight, false);
  62. }
  63.  
  64. minimum_spanning_tree.Debug();
  65. return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement