class
Solution:
def
__init__(
self
):
self
.parent
=
[]
self
.rank
=
[]
def
find(
self
, x):
if
self
.parent[x]
=
=
x:
return
x
self
.parent[x]
=
self
.find(
self
.parent[x])
return
self
.parent[x]
def
union(
self
, x, y):
x_parent
=
self
.find(x)
y_parent
=
self
.find(y)
if
self
.rank[x_parent] >
self
.rank[y_parent]:
self
.parent[y_parent]
=
x_parent
elif
self
.rank[x_parent] <
self
.rank[y_parent]:
self
.parent[x_parent]
=
y_parent
else
:
self
.parent[x_parent]
=
y_parent
self
.rank[y_parent]
+
=
1
def
detectCycle(
self
, V, adj):
self
.parent
=
[i
for
i
in
range
(V)]
self
.rank
=
[
0
]
*
V
for
i
in
range
(V):
self
.parent[i]
=
i
for
u
in
range
(V):
for
v
in
adj[u]:
if
u < v:
if
self
.find(u)
=
=
self
.find(v):
return
True
else
:
self
.union(u, v)
return
False
if
__name__
=
=
"__main__"
:
V
=
4
E
=
3
adj
=
[[]
for
_
in
range
(V)]
edges
=
[(
1
,
2
), (
2
,
3
), (
3
,
1
)]
for
u, v
in
edges:
adj[u
-
1
].append(v
-
1
)
adj[v
-
1
].append(u
-
1
)
sol
=
Solution()
if
sol.detectCycle(V, adj):
print
(
"The graph contains a cycle."
)
else
:
print
(
"The graph does not contain a cycle."
)