diff --git a/algorithm.xcodeproj/project.xcworkspace/xcuserdata/aseshshrestha.xcuserdatad/UserInterfaceState.xcuserstate b/algorithm.xcodeproj/project.xcworkspace/xcuserdata/aseshshrestha.xcuserdatad/UserInterfaceState.xcuserstate index bfc2c76..46343b3 100755 Binary files a/algorithm.xcodeproj/project.xcworkspace/xcuserdata/aseshshrestha.xcuserdatad/UserInterfaceState.xcuserstate and b/algorithm.xcodeproj/project.xcworkspace/xcuserdata/aseshshrestha.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/algorithm.xcodeproj/xcuserdata/aseshshrestha.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/algorithm.xcodeproj/xcuserdata/aseshshrestha.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 8cc697a..3a51261 100755 --- a/algorithm.xcodeproj/xcuserdata/aseshshrestha.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/algorithm.xcodeproj/xcuserdata/aseshshrestha.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "345" - endingLineNumber = "345" + startingLineNumber = "350" + endingLineNumber = "350" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -30,8 +30,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "311" - endingLineNumber = "311" + startingLineNumber = "316" + endingLineNumber = "316" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -46,8 +46,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "236" - endingLineNumber = "236" + startingLineNumber = "241" + endingLineNumber = "241" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -62,8 +62,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "204" - endingLineNumber = "204" + startingLineNumber = "209" + endingLineNumber = "209" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -174,8 +174,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "162" - endingLineNumber = "162" + startingLineNumber = "167" + endingLineNumber = "167" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -190,8 +190,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "125" - endingLineNumber = "125" + startingLineNumber = "130" + endingLineNumber = "130" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -206,8 +206,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "84" - endingLineNumber = "84" + startingLineNumber = "89" + endingLineNumber = "89" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -238,8 +238,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "73" - endingLineNumber = "73" + startingLineNumber = "78" + endingLineNumber = "78" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -254,8 +254,8 @@ filePath = "algorithm/main.cpp" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "59" - endingLineNumber = "59" + startingLineNumber = "64" + endingLineNumber = "64" landmarkName = "main(argc, argv)" landmarkType = "9"> @@ -263,17 +263,154 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/algorithm/graph_algorithm.cpp b/algorithm/graph_algorithm.cpp index 28be1d6..3c7483f 100644 --- a/algorithm/graph_algorithm.cpp +++ b/algorithm/graph_algorithm.cpp @@ -9,29 +9,85 @@ #include "header.h" #include "graph_algorithm.h" -void create_directed_graph() { - // Adjanceny list representation of graph +void create_undirected_graph() { + // Adjacency list representation of graph /* - 3 - 8 - 6 - 9 - 11 - 10 | | | | 1 - 7 - 0 - 12 - 19 - 17 | | | | 4 - 5 - 13 - 18 - 20 + */ + std::unordered_map> undirected_graph = { + {3, {1, 8}}, + {8, {3, 6}}, + {6, {8, 9, 0}}, + {9, {6, 11, 12}}, + {11, {9, 10}}, + {10, {11, 17}}, + {1, {3, 7}}, + {7, {0, 1, 5}}, + {0, {6, 7, 12, 13}}, + {12, {0, 9, 18, 19}}, + {19, {12, 17, 20}}, + {17, {10, 19}}, + {4, {5}}, + {5, {4, 7, 13}}, + {13, {0, 5, 18}}, + {18, {12, 13, 20}}, + {20, {18, 19}} + }; + + CBaseGraph undi_graph(std::move(undirected_graph)); + undi_graph.traverse_bfs(3); + undi_graph.traverse_dfs(7); +} + +void create_directed_graph() { + // Adjanceny list representation of directed graph + /* + 3 -> 8 -> 6 -> 9 -> 11 -> 10 + | | | | + 1 -> 7 -> 0 -> 12 -> 19 -> 17 + | | | | + 4 <- 5 <- 13 <- 18 <- 20 Adjacency list: Node Adjacent nodes 3 8 - 1 - 8 3 - 6 - 6 8 - 9 - 0 - 0 6 - 7 - 12 - 13 - ... - 20 18 - 19 + 8 6 + 6 9 - 0 + 9 11 - 12 + 11 10 + 10 17 + 1 7 + 7 0 - 5 + 0 12 - 13 + 12 18 - 19 + 19 17 - 20 + 4 + 5 4 + 13 5 + 18 13 + 20 18 */ std::unordered_map> directed_graph = { - {1, {3, 7}}, - {3, {1, 8}} + {3, {1, 8}}, + {8, {6}}, + {6, {9, 0}}, + {9, {11, 12}}, + {11, {10}}, + {10, {17}}, + {1, {7}}, + {7, {0, 5}}, + {0, {12, 13}}, + {12, {18, 19}}, + {19, {17, 20}}, + {5, {4}}, + {13, {5}}, + {18, {13}}, + {20, {18}} }; - CDirectedGraph di_graph(directed_graph); - + CDirectedGraph di_graph(std::move(directed_graph)); + di_graph.traverse_bfs(); } diff --git a/algorithm/graph_algorithm.h b/algorithm/graph_algorithm.h index 809307c..205de32 100755 --- a/algorithm/graph_algorithm.h +++ b/algorithm/graph_algorithm.h @@ -10,10 +10,69 @@ #define GRAPH_ALGORITHM_H template -class CGraph { +class CBaseGraph { public: - CGraph(std::unordered_map>& adjacency_list) { - m_adjacency_list = adjacency_list; + CBaseGraph(std::unordered_map>&& adjacency_list) { + m_adjacency_list = std::move(adjacency_list); + } + + virtual void traverse_dfs(int starting_node = -1) { + std::unordered_set visited_nodes; + + if(!m_adjacency_list.contains(starting_node)) { + return; + } + + std::stack nodes_to_be_visited; + nodes_to_be_visited.push(starting_node); + + visited_nodes.insert(starting_node); + + std::cout< visited_nodes; + + if(!m_adjacency_list.contains(starting_node)) { + return; + } + + visited_nodes.insert(starting_node); + + std::queue nodes_to_be_visited; + nodes_to_be_visited.push(starting_node); + + std::cout<<"BFS: "; + + while(!nodes_to_be_visited.empty()) { + for(const auto& adjacent_node: m_adjacency_list[nodes_to_be_visited.front()]) { + if(!visited_nodes.contains(adjacent_node)) { + visited_nodes.insert(adjacent_node); + nodes_to_be_visited.push(adjacent_node); + } + } + + std::cout< -class CDirectedGraph : CGraph { +class CDirectedGraph : public CBaseGraph { public: - CDirectedGraph(std::unordered_map>& adjacency_list) : - CGraph(adjacency_list) { + CDirectedGraph(std::unordered_map>&& adjacency_list) : + CBaseGraph(std::move(adjacency_list)) { + } + +protected: + void make_graph() override { } private: }; +void create_undirected_graph(); void create_directed_graph(); #endif /* GRAPH_ALGORITHM_H */ diff --git a/algorithm/header.h b/algorithm/header.h index 0686ab1..914eb23 100755 --- a/algorithm/header.h +++ b/algorithm/header.h @@ -46,6 +46,10 @@ #include +#include + +#include + #include #include diff --git a/algorithm/main.cpp b/algorithm/main.cpp index 4fb4913..cc7da25 100755 --- a/algorithm/main.cpp +++ b/algorithm/main.cpp @@ -20,7 +20,12 @@ int main(int argc, const char* argv[]) { - create_directed_graph(); + invoke_calculate_minimum_coins(); + +// std::cout<<(-1%10)<& denoms, int coins_needed, std::unordered_map& computed_targets) { + if(target < 0) { + return INT_MAX; + } + + if(computed_targets.contains(target) && computed_targets.at(target) <= coins_needed) { + std::cout<<"Using pre-computed data: "< value: "< computed_targets; + int minimum_coins = calculate_minimum_coins(11, {1, 2, 5}, 0, computed_targets); + std::cout<<"Min. coins needed: "< input_array); void rat_in_a_maze_impl(const std::vector>& input, std::vector>& output, const std::vector& destination); void rat_in_a_maze(); +void calculate_minimum_coins(int target, const std::vector& denoms, int coins_needed, int& min_coins, std::unordered_map& computed_targets); +void invoke_calculate_minimum_coins(); + #endif /* number_algorithm_hpp */