Created
June 22, 2022 08:26
-
-
Save shdwkl/822d73de2e4cf83b746b27a6d4142275 to your computer and use it in GitHub Desktop.
Eulerian Path is a path in graph that visits every edge exactly once. || Eulerian Circuit is an Eulerian Path which starts and ends on the same || vertex. || time complexity is O(V+E) || space complexity is O(VE)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Eulerian Path is a path in graph that visits every edge exactly once. | |
| # Eulerian Circuit is an Eulerian Path which starts and ends on the same | |
| # vertex. | |
| # time complexity is O(V+E) | |
| # space complexity is O(VE) | |
| # using dfs for finding eulerian path traversal | |
| def dfs(u, graph, visited_edge, path=None): | |
| path = (path or []) + [u] | |
| for v in graph[u]: | |
| if visited_edge[u][v] is False: | |
| visited_edge[u][v], visited_edge[v][u] = True, True | |
| path = dfs(v, graph, visited_edge, path) | |
| return path | |
| # for checking in graph has euler path or circuit | |
| def check_circuit_or_path(graph, max_node): | |
| odd_degree_nodes = 0 | |
| odd_node = -1 | |
| for i in range(max_node): | |
| if i not in graph.keys(): | |
| continue | |
| if len(graph[i]) % 2 == 1: | |
| odd_degree_nodes += 1 | |
| odd_node = i | |
| if odd_degree_nodes == 0: | |
| return 1, odd_node | |
| if odd_degree_nodes == 2: | |
| return 2, odd_node | |
| return 3, odd_node | |
| def check_euler(graph, max_node): | |
| 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: | |
| print("graph is not Eulerian") | |
| print("no path") | |
| return | |
| start_node = 1 | |
| if check == 2: | |
| start_node = odd_node | |
| print("graph has a Euler path") | |
| if check == 1: | |
| print("graph has a Euler cycle") | |
| path = dfs(start_node, graph, visited_edge) | |
| print(path) | |
| def main(): | |
| G1 = {1: [2, 3, 4], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [4]} | |
| G2 = {1: [2, 3, 4, 5], 2: [1, 3], 3: [1, 2], 4: [1, 5], 5: [1, 4]} | |
| G3 = {1: [2, 3, 4], 2: [1, 3, 4], 3: [1, 2], 4: [1, 2, 5], 5: [4]} | |
| G4 = {1: [2, 3], 2: [1, 3], 3: [1, 2]} | |
| G5 = { | |
| 1: [], | |
| 2: [] | |
| # all degree is zero | |
| } | |
| max_node = 10 | |
| check_euler(G1, max_node) | |
| check_euler(G2, max_node) | |
| check_euler(G3, max_node) | |
| check_euler(G4, max_node) | |
| check_euler(G5, max_node) | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment