mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
b76115e8d1
* Create dijkstra_algorithm.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dijkstra_algorithm.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dijkstra_algorithm.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update dijkstra_algorithm.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Delete greedy_methods/dijkstra_algorithm.py * Update check_bipartite_graph_dfs.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update check_bipartite_graph_dfs.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update graphs/check_bipartite_graph_dfs.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update graphs/check_bipartite_graph_dfs.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update check_bipartite_graph_dfs.py * Update check_bipartite_graph_dfs.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update check_bipartite_graph_dfs.py * Update check_bipartite_graph_dfs.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update check_bipartite_graph_dfs.py * Update check_bipartite_graph_dfs.py * Update check_bipartite_graph_dfs.py * Let's use self-documenting variable names This is complex code so let's use self-documenting function and variable names to help readers to understand. We should not shorten names to simplify the code formatting but use understandable name and leave to code formatting to psf/black. I am not sure if `nbor` was supposed to be `neighbour`. ;-) * Update check_bipartite_graph_dfs.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
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!")
|