|
@@ -1,4 +1,3 @@
|
|
|
-import random
|
|
|
from queue import Queue
|
|
|
from typing import Dict, List, Optional, Tuple
|
|
|
|
|
@@ -16,14 +15,15 @@ class ColoringProblemBFSSolution:
|
|
|
|
|
|
def __init__(self, vertexes: List[Vertex]):
|
|
|
self._vertexes = vertexes
|
|
|
- self._is_solvable = False
|
|
|
+ self._is_solvable = True
|
|
|
|
|
|
- def bfs(self, m=2):
|
|
|
+ def bfs(self, m=2) -> None:
|
|
|
+ m -= 1
|
|
|
n = len(self._vertexes)
|
|
|
- visited = [False for _ in range(n + 1)]
|
|
|
+ visited = [False for _ in range(n)]
|
|
|
max_color_count = 1
|
|
|
|
|
|
- for i in range(1, n + 1):
|
|
|
+ for i in range(n):
|
|
|
if not visited[i]:
|
|
|
visited[i] = True
|
|
|
q = Queue()
|
|
@@ -38,31 +38,31 @@ class ColoringProblemBFSSolution:
|
|
|
|
|
|
max_color_count = max(max_color_count, max(self._vertexes[top].color, self._vertexes[j].color))
|
|
|
if max_color_count > m:
|
|
|
- return False
|
|
|
+ self._is_solvable = False
|
|
|
+ self._vertexes[j].color = 0
|
|
|
|
|
|
if not visited[j]:
|
|
|
visited[j] = True
|
|
|
q.put(j)
|
|
|
|
|
|
- self._is_solvable = True
|
|
|
-
|
|
|
- return True
|
|
|
-
|
|
|
- def get_colored(self) -> Dict[str, int]:
|
|
|
+ def get_colored(self) -> Tuple[bool, Dict[str, int]]:
|
|
|
colored = dict()
|
|
|
- if self._is_solvable:
|
|
|
- for v in self._vertexes:
|
|
|
- colored.update({v.id: v.color})
|
|
|
- else:
|
|
|
- for v in self._vertexes:
|
|
|
- colored.update({v.id: random.choice([0, 1])})
|
|
|
+ for v in self._vertexes:
|
|
|
+ colored.update({v.id: v.color})
|
|
|
|
|
|
- return colored
|
|
|
+ return self._is_solvable, colored
|
|
|
|
|
|
|
|
|
def reformat(graph: Dict[str, List]) -> List[Vertex]:
|
|
|
- vertexes = []
|
|
|
+ vertex_idx_dic = dict()
|
|
|
+ idx = 0
|
|
|
+ for k in graph.keys():
|
|
|
+ vertex_idx_dic.update({k: idx})
|
|
|
+ idx += 1
|
|
|
+
|
|
|
+ vertexes = list()
|
|
|
for v, edges in graph.items():
|
|
|
+ edges = [vertex_idx_dic[item] for item in edges]
|
|
|
vertexes.append(Vertex(id=v, color=0, edges=set(edges)))
|
|
|
|
|
|
return vertexes
|
|
@@ -72,6 +72,6 @@ def reformat(graph: Dict[str, List]) -> List[Vertex]:
|
|
|
async def get_graph_coloring(graph: Dict[str, List]) -> Tuple[bool, Dict[str, int]]:
|
|
|
vertexes = reformat(graph)
|
|
|
solution = ColoringProblemBFSSolution(vertexes)
|
|
|
- is_solvable = solution.bfs()
|
|
|
+ solution.bfs()
|
|
|
|
|
|
- return is_solvable, solution.get_colored()
|
|
|
+ return solution.get_colored()
|