Skip to content

Added doctests to eulerian_path_and_circuit_for_undirected_graph.py #11883

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
2 changes: 2 additions & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@
* [Longest Common Subsequence](dynamic_programming/longest_common_subsequence.py)
* [Longest Common Substring](dynamic_programming/longest_common_substring.py)
* [Longest Increasing Subsequence](dynamic_programming/longest_increasing_subsequence.py)
* [Longest Increasing Subsequence Iterative](dynamic_programming/longest_increasing_subsequence_iterative.py)
* [Longest Increasing Subsequence O Nlogn](dynamic_programming/longest_increasing_subsequence_o_nlogn.py)
* [Longest Palindromic Subsequence](dynamic_programming/longest_palindromic_subsequence.py)
* [Matrix Chain Multiplication](dynamic_programming/matrix_chain_multiplication.py)
Expand Down Expand Up @@ -462,6 +463,7 @@

## Graphics
* [Bezier Curve](graphics/bezier_curve.py)
* [Butterfly Pattern](graphics/butterfly_pattern.py)
* [Digital Differential Analyzer Line](graphics/digital_differential_analyzer_line.py)
* [Vector3 For 2D Rendering](graphics/vector3_for_2d_rendering.py)

Expand Down
74 changes: 72 additions & 2 deletions graphs/eulerian_path_and_circuit_for_undirected_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,31 @@
# space complexity is O(VE)


# using dfs for finding eulerian path traversal
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], 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]
for v in graph[u]:
if visited_edge[u][v] is False:
Expand All @@ -15,8 +38,29 @@ def dfs(u, graph, visited_edge, path=None):
return path


# for checking in graph has euler path or circuit
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: [], 3: [1, 2], 4: [], 5: [4]}, 10)
(2, 5)
>>> check_circuit_or_path({1: [2, 3, 1], 2: [2], 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_node = -1
for i in range(max_node):
Expand All @@ -33,6 +77,28 @@ def check_circuit_or_path(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)]
check, odd_node = check_circuit_or_path(graph, max_node)
if check == 3:
Expand Down Expand Up @@ -69,3 +135,7 @@ def main():

if __name__ == "__main__":
main()

import doctest

doctest.testmod()