Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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()