Added doc_tests to eulerian_path_and_circuit_for_undirected_graph.py

This commit is contained in:
Jordan Sinclair 2024-10-08 00:24:57 -05:00
parent 2d671df073
commit e1271617b7

View File

@ -5,8 +5,31 @@
# space complexity is O(VE) # space complexity is O(VE)
# using dfs for finding eulerian path traversal
def dfs(u, graph, visited_edge, path=None): def dfs(u, graph, visited_edge, path=None):
"""
Using dfs for finding eulerian path traversal
Args:
u: The start_node
graph: The graph to check
visited_edge: Specify if a node has been visited or not
path: Optional path parameter
Returns:
Path
Example:
>>> visited_edge = [[False] * 11 for _ in range(11)]
>>> dfs(1, {1: [2, 3], 2: [1, 3], 3: [1, 2]}, visited_edge)
[1, 2, 3, 1]
>>> dfs(5, {1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]}, visited_edge)
[5, 4, 1]
>>> dfs(1, {1: [], 2: [], 3: [1, 2]}, visited_edge)
[1]
>>> dfs(1, {1: [], 2: []}, visited_edge)
[1]
>>> dfs(1, {1: [], 2: []}, visited_edge, [1, 3])
[1, 3, 1]
"""
path = (path or []) + [u] path = (path or []) + [u]
for v in graph[u]: for v in graph[u]:
if visited_edge[u][v] is False: if visited_edge[u][v] is False:
@ -15,8 +38,29 @@ def dfs(u, graph, visited_edge, path=None):
return path return path
# for checking in graph has euler path or circuit
def check_circuit_or_path(graph, max_node): def check_circuit_or_path(graph, max_node):
"""
For checking in graph has euler path or circuit
Args:
graph: The graph to check
max_node: The maximum node to check
Returns:
Type of graph, and its circuit or path
Example:
>>> check_circuit_or_path({1: [2, 3], 2: [1, 3], 3: [1, 2]}, 10)
(1, -1)
>>> check_circuit_or_path({1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]}, 10)
(2, 5)
>>> check_circuit_or_path({1: [2, 3, 1], 2: [2, 3, 4], 3: [1, 3], 4: [1], 5: []}, 10)
(3, 4)
>>> check_circuit_or_path({1: [], 2: [], 3: [1, 2]}, 10)
(1, -1)
>>> check_circuit_or_path({1: [], 2: []}, 10)
(1, -1)
"""
odd_degree_nodes = 0 odd_degree_nodes = 0
odd_node = -1 odd_node = -1
for i in range(max_node): for i in range(max_node):
@ -33,6 +77,28 @@ def check_circuit_or_path(graph, max_node):
def check_euler(graph, max_node): def check_euler(graph, max_node):
"""
Args:
graph: The graph to check
max_node: The maximum node to check
Example:
>>> check_euler({1: [2, 3], 2: [1, 3], 3: [1, 2]}, 10)
graph has a Euler cycle
[1, 2, 3, 1]
>>> check_euler({1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]}, 10)
graph has a Euler path
[5, 4, 1, 2, 3, 1]
>>> check_euler({1: [2, 3, 1], 2: [2, 3, 4], 3: [1, 3], 4: [1], 5: []}, 10)
graph is not Eulerian
no path
>>> check_euler({1: [], 2: [], 3: [1, 2]}, 10)
graph has a Euler cycle
[1]
>>> check_euler({1: [], 2: []}, 10)
graph has a Euler cycle
[1]
"""
visited_edge = [[False for _ in range(max_node + 1)] for _ in range(max_node + 1)] visited_edge = [[False for _ in range(max_node + 1)] for _ in range(max_node + 1)]
check, odd_node = check_circuit_or_path(graph, max_node) check, odd_node = check_circuit_or_path(graph, max_node)
if check == 3: if check == 3:
@ -69,3 +135,7 @@ def main():
if __name__ == "__main__": if __name__ == "__main__":
main() main()
import doctest
doctest.testmod()