2019-05-16 11:20:27 +00:00
|
|
|
# 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
|
2021-08-31 04:56:15 +00:00
|
|
|
def dfs(u, graph, visited_edge, path=None):
|
|
|
|
path = (path or []) + [u]
|
2019-05-16 11:20:27 +00:00
|
|
|
for v in graph[u]:
|
2020-05-22 06:10:11 +00:00
|
|
|
if visited_edge[u][v] is False:
|
2019-05-16 11:20:27 +00:00
|
|
|
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):
|
2023-07-31 20:53:26 +00:00
|
|
|
if i not in graph:
|
2019-05-16 11:20:27 +00:00
|
|
|
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():
|
2022-10-12 22:54:20 +00:00
|
|
|
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 = {
|
2019-05-16 11:20:27 +00:00
|
|
|
1: [],
|
2024-01-16 08:39:54 +00:00
|
|
|
2: [],
|
2019-05-16 11:20:27 +00:00
|
|
|
# all degree is zero
|
|
|
|
}
|
|
|
|
max_node = 10
|
2022-10-12 22:54:20 +00:00
|
|
|
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)
|
2019-05-16 11:20:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|