mirror of
https://github.com/TheAlgorithms/Python.git
synced 2026-09-28 13:33:11 +08:00
* Create Calc.py * Rename Calc.py to calc.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Create rat_in_a_maze.py * Delete dynamic_programming/rat_in_a_maze.py * Create m-coloring-problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Rename m-coloring-problem.py to m_coloring_problem.py * Delete other/calc.py * Update m_coloring_problem.py * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update m_coloring_problem.py * Update m_coloring_problem.py * Update m_coloring_problem.py * Update m_coloring_problem.py * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update m_coloring_problem.py * Update m_coloring_problem.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
def is_safe(
|
|
node: int,
|
|
color: int,
|
|
graph: list[list[int]],
|
|
num_vertices: int,
|
|
col: list[int],
|
|
) -> bool:
|
|
"""
|
|
Check if it is safe to assign a color to a node.
|
|
|
|
>>> is_safe(0, 1, [[0,1],[1,0]], 2, [0,1])
|
|
False
|
|
>>> is_safe(0, 2, [[0,1],[1,0]], 2, [0,1])
|
|
True
|
|
"""
|
|
return all(
|
|
not (graph[node][k] == 1 and col[k] == color) for k in range(num_vertices)
|
|
)
|
|
|
|
|
|
def solve(
|
|
node: int,
|
|
col: list[int],
|
|
max_colors: int,
|
|
num_vertices: int,
|
|
graph: list[list[int]],
|
|
) -> bool:
|
|
"""
|
|
Recursively try to color the graph using at most max_colors.
|
|
|
|
>>> solve(0, [0]*3, 3, 3, [[0,1,0],[1,0,1],[0,1,0]])
|
|
True
|
|
>>> solve(0, [0]*3, 2, 3, [[0,1,0],[1,0,1],[0,1,0]])
|
|
True
|
|
"""
|
|
if node == num_vertices:
|
|
return True
|
|
for c in range(1, max_colors + 1):
|
|
if is_safe(node, c, graph, num_vertices, col):
|
|
col[node] = c
|
|
if solve(node + 1, col, max_colors, num_vertices, graph):
|
|
return True
|
|
col[node] = 0
|
|
return False
|
|
|
|
|
|
def graph_coloring(graph: list[list[int]], max_colors: int, num_vertices: int) -> bool:
|
|
"""
|
|
Determine if the graph can be colored with at most max_colors.
|
|
|
|
>>> graph_coloring([[0,1,1],[1,0,1],[1,1,0]], 3, 3)
|
|
True
|
|
>>> graph_coloring([[0,1,1],[1,0,1],[1,1,0]], 2, 3)
|
|
False
|
|
"""
|
|
col = [0] * num_vertices
|
|
return solve(0, col, max_colors, num_vertices, graph)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|
|
|
|
num_vertices = int(input("Enter vertices: "))
|
|
num_edges = int(input("Enter edges: "))
|
|
graph = [[0] * num_vertices for _ in range(num_vertices)]
|
|
|
|
print("Enter edges (u v):")
|
|
for _ in range(num_edges):
|
|
try:
|
|
u, v = map(int, input().split())
|
|
if 0 <= u < num_vertices and 0 <= v < num_vertices:
|
|
graph[u][v] = 1
|
|
graph[v][u] = 1
|
|
else:
|
|
print("Invalid edge.")
|
|
except ValueError:
|
|
print("Invalid input.")
|
|
|
|
max_colors = int(input("Enter max colors: "))
|
|
|
|
if graph_coloring(graph, max_colors, num_vertices):
|
|
print("Coloring possible.")
|
|
else:
|
|
print("Coloring not possible.")
|