1414#include < vector> // / for std::vector
1515#include < iostream> // / for IO operations
1616#include < cassert> // / for assert
17+ #include < cstdint> // / for fixed-size integer types (e.g., std::uint32_t)
1718
1819/* *
1920 * @namespace graph
@@ -30,15 +31,19 @@ namespace graph {
3031 * @param visited a vector to keep track of visited nodes in the current DFS path
3132 * @returns the number of paths from node `u` to node `v`
3233 */
33- int count_paths_dfs (const std::vector<std::vector<unsigned int >>& A, int u, int v, int n, std::vector<bool >& visited) {
34+ std::uint32_t count_paths_dfs (const std::vector<std::vector<std::uint32_t >>& A,
35+ std::uint32_t u,
36+ std::uint32_t v,
37+ std::uint32_t n,
38+ std::vector<bool >& visited) {
3439 if (u == v) {
3540 return 1 ; // Base case: Reached the destination node
3641 }
3742
3843 visited[u] = true ; // Mark the current node as visited
39- int path_count = 0 ; // Count of all paths from `u` to `v`
44+ std:: uint32_t path_count = 0 ; // Count of all paths from `u` to `v`
4045
41- for (int i = 0 ; i < n; i++) {
46+ for (std:: uint32_t i = 0 ; i < n; i++) {
4247 if (A[u][i] == 1 && !visited[i]) { // Check if there is an edge and the node is not visited
4348 path_count += count_paths_dfs (A, i, v, n, visited); // Recursively explore paths from `i` to `v`
4449 }
@@ -58,7 +63,10 @@ namespace graph {
5863 * @param n the number of nodes in the graph
5964 * @returns the number of paths from node `u` to node `v`
6065 */
61- int count_paths (const std::vector<std::vector<unsigned int >>& A, int u, int v, int n) {
66+ std::uint32_t count_paths (const std::vector<std::vector<std::uint32_t >>& A,
67+ std::uint32_t u,
68+ std::uint32_t v,
69+ std::uint32_t n) {
6270 std::vector<bool > visited (n, false ); // Initialize a visited vector for tracking nodes
6371 return count_paths_dfs (A, u, v, n, visited);
6472 }
@@ -71,43 +79,43 @@ namespace graph {
7179 */
7280static void test () {
7381 // Test case 1: Simple directed graph with multiple paths
74- std::vector<std::vector<unsigned int >> graph1 = {
82+ std::vector<std::vector<std:: uint32_t >> graph1 = {
7583 {0 , 1 , 0 , 1 , 0 },
7684 {0 , 0 , 1 , 0 , 1 },
7785 {0 , 0 , 0 , 0 , 1 },
7886 {0 , 0 , 1 , 0 , 0 },
7987 {0 , 0 , 0 , 0 , 0 }
8088 };
81- int n1 = 5 , u1 = 0 , v1 = 4 ;
89+ std:: uint32_t n1 = 5 , u1 = 0 , v1 = 4 ;
8290 assert (graph::count_paths (graph1, u1, v1, n1) == 3 ); // There are 3 paths from node 0 to 4
8391
8492 // Test case 2: No possible path (disconnected graph)
85- std::vector<std::vector<unsigned int >> graph2 = {
93+ std::vector<std::vector<std:: uint32_t >> graph2 = {
8694 {0 , 1 , 0 , 0 , 0 },
8795 {0 , 0 , 0 , 0 , 0 },
8896 {0 , 0 , 0 , 0 , 1 },
8997 {0 , 0 , 1 , 0 , 0 },
9098 {0 , 0 , 0 , 0 , 0 }
9199 };
92- int n2 = 5 , u2 = 0 , v2 = 4 ;
100+ std:: uint32_t n2 = 5 , u2 = 0 , v2 = 4 ;
93101 assert (graph::count_paths (graph2, u2, v2, n2) == 0 ); // No path from node 0 to 4
94102
95103 // Test case 3: Cyclic graph with multiple paths
96- std::vector<std::vector<unsigned int >> graph3 = {
104+ std::vector<std::vector<std:: uint32_t >> graph3 = {
97105 {0 , 1 , 0 , 0 , 0 },
98106 {0 , 0 , 1 , 1 , 0 },
99107 {1 , 0 , 0 , 0 , 1 },
100108 {0 , 0 , 1 , 0 , 1 },
101109 {0 , 0 , 0 , 0 , 0 }
102110 };
103- int n3 = 5 , u3 = 0 , v3 = 4 ;
111+ std:: uint32_t n3 = 5 , u3 = 0 , v3 = 4 ;
104112 assert (graph::count_paths (graph3, u3, v3, n3) == 3 ); // There are 3 paths from node 0 to 4
105113
106114 // Test case 4: Single node graph (self-loop)
107- std::vector<std::vector<unsigned int >> graph4 = {
115+ std::vector<std::vector<std:: uint32_t >> graph4 = {
108116 {0 }
109117 };
110- int n4 = 1 , u4 = 0 , v4 = 0 ;
118+ std:: uint32_t n4 = 1 , u4 = 0 , v4 = 0 ;
111119 assert (graph::count_paths (graph4, u4, v4, n4) == 1 ); // There is self-loop, so 1 path from node 0 to 0
112120
113121 std::cout << " All tests have successfully passed!\n " ;
0 commit comments