-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patheuler_directed_graph.py
More file actions
86 lines (63 loc) · 2.04 KB
/
euler_directed_graph.py
File metadata and controls
86 lines (63 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# A directed graph has Euler cycle if
# - All vertices with nonzero degree belong to a single strongly connected
# component
# - In degree and out degree of every vertex is same
from collections import defaultdict
class Graph:
def __init__(self, vertices):
self.V = vertices # No. of vertices
self.graph = defaultdict(list) # default dictionary to store graph
self.IN = [0] * self.V
# function to add an edge to graph
def addEdge(self, u, v):
self.graph[u].append(v)
self.IN[v] += 1
def DFSUtil(self, v, visited):
visited[v] = True
for i in self.graph[v]:
if visited[i] == False:
self.DFSUtil(i, visited)
def getTranspose(self):
gr = Graph(self.V)
for node in range(self.V):
for child in self.graph[node]:
gr.addEdge(child, node)
return gr
def isSC(self):
visited = [False] * self.V
v = 0
for v in range(self.V):
if len(self.graph[v]) > 0:
break
self.DFSUtil(v, visited)
# If DFS not visit all node, return False
for i in range(self.V):
if visited[i] == False:
return False
gr = self.getTranspose()
visited = [False] * self.V
gr.DFSUtil(v, visited)
for i in range(self.V):
if visited[i] == False:
return False
return True
def isEulerCycle(self):
# Check if all non-zero degree vertices are connected
if self.isSC() == False:
return False
# Check if in degree and out degree of every vertex is same
for v in range(self.V):
if self.IN[v] != len(self.graph[v]):
return False
return True
g = Graph(5)
g.addEdge(1, 0)
g.addEdge(0, 2)
g.addEdge(2, 1)
g.addEdge(0, 3)
g.addEdge(3, 4)
g.addEdge(4, 0)
if g.isEulerCycle():
print ("Given directed graph is eulerian")
else:
print ("Given directed graph is NOT eulerian")