forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck_bipartite_graph_dfs.py
55 lines (42 loc) · 1.65 KB
/
check_bipartite_graph_dfs.py
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
from collections import defaultdict
def is_bipartite(graph: defaultdict[int, list[int]]) -> bool:
"""
Check whether a graph is Bipartite or not using Depth-First Search (DFS).
A Bipartite Graph is a graph whose vertices can be divided into two independent
sets, U and V such that every edge (u, v) either connects a vertex from
U to V or a vertex from V to U. In other words, for every edge (u, v),
either u belongs to U and v to V, or u belongs to V and v to U. There is
no edge that connects vertices of the same set.
Args:
graph: An adjacency list representing the graph.
Returns:
True if there's no edge that connects vertices of the same set, False otherwise.
Examples:
>>> is_bipartite(
... defaultdict(list, {0: [1, 2], 1: [0, 3], 2: [0, 4], 3: [1], 4: [2]})
... )
False
>>> is_bipartite(defaultdict(list, {0: [1, 2], 1: [0, 2], 2: [0, 1]}))
True
"""
def depth_first_search(node: int, color: int) -> bool:
visited[node] = color
return any(
visited[neighbour] == color
or (
visited[neighbour] == -1
and not depth_first_search(neighbour, 1 - color)
)
for neighbour in graph[node]
)
visited: defaultdict[int, int] = defaultdict(lambda: -1)
return all(
not (visited[node] == -1 and not depth_first_search(node, 0)) for node in graph
)
if __name__ == "__main__":
import doctest
result = doctest.testmod()
if result.failed:
print(f"{result.failed} test(s) failed.")
else:
print("All tests passed!")