回答編集履歴
1
修正
test
CHANGED
@@ -129,3 +129,127 @@
|
|
129
129
|
print(graph_color) # {'A': 1, 'B': 0, 'E': 2, 'D': 1, 'C': 2, 'F': 0, 'H': 0, 'G': 1}
|
130
130
|
|
131
131
|
```
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
#### コメントを受けて修正
|
136
|
+
|
137
|
+
`B`の着色時、`F`と`H`は`B`に接続していないので同色で着色していましたが、`F`と`H`がつながっていることが考慮されていませんでした。
|
138
|
+
|
139
|
+
これを考慮し、なおかつコードを全面的に修正しました。
|
140
|
+
|
141
|
+
```Python
|
142
|
+
|
143
|
+
#
|
144
|
+
|
145
|
+
# 隣接ノード'edge'が指定した色'clr'を持っているか
|
146
|
+
|
147
|
+
#
|
148
|
+
|
149
|
+
def has_color(edge,clr,graph_clr):
|
150
|
+
|
151
|
+
for e in edge:
|
152
|
+
|
153
|
+
if e in graph_clr:
|
154
|
+
|
155
|
+
if graph_clr[e] == clr:
|
156
|
+
|
157
|
+
return True
|
158
|
+
|
159
|
+
return False
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
#エッジがある場合はそのノードを記述(例AとBはつながっている,BはA,C,D,E,Gとつながってる)
|
164
|
+
|
165
|
+
A = ['B']
|
166
|
+
|
167
|
+
B = ['A','C','D','E','G']
|
168
|
+
|
169
|
+
C = ['B','D']
|
170
|
+
|
171
|
+
D = ['B','C','E','F','H']
|
172
|
+
|
173
|
+
E = ['B','D','F','G']
|
174
|
+
|
175
|
+
F = ['D','E','G','H']
|
176
|
+
|
177
|
+
G = ['B','E','F','H']
|
178
|
+
|
179
|
+
H = ['D','F','G']
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
# ノード→エッジマップを作成
|
184
|
+
|
185
|
+
edges = [A, B, C, D, E, F, G, H]
|
186
|
+
|
187
|
+
nodes = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
|
188
|
+
|
189
|
+
graph_map = {k:v for k,v in zip(nodes,edges)}
|
190
|
+
|
191
|
+
#print(graph_map)
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
#次数を求め、降順でソート
|
196
|
+
|
197
|
+
graph_dim = {k:len(v) for k,v in graph_map.items()}
|
198
|
+
|
199
|
+
graph_dim = sorted( graph_dim.items(), key=lambda x: x[1], reverse=True)
|
200
|
+
|
201
|
+
#print(graph_dim)
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
# 3,まだ塗ってない中で次数が一番高いものに色を塗る
|
206
|
+
|
207
|
+
clr = 0 # あらたに塗る色番号
|
208
|
+
|
209
|
+
graph_clr = {}# ノード→色番号マップ
|
210
|
+
|
211
|
+
for i, node_dim in enumerate(graph_dim):
|
212
|
+
|
213
|
+
node = node_dim[0]
|
214
|
+
|
215
|
+
if node in graph_clr: # すでに着色済み
|
216
|
+
|
217
|
+
continue
|
218
|
+
|
219
|
+
graph_clr[node] = clr
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
# 4,次数が一番高いものとつながりがなくまだ色を割り振っていないものを同じ色で塗る
|
224
|
+
|
225
|
+
# ※この条件だけだとFとHが同じ色になる
|
226
|
+
|
227
|
+
for j in range(i+1,len(graph_dim)): # 次の次数の大きいものから順に走査
|
228
|
+
|
229
|
+
sub_node = graph_dim[j][0]
|
230
|
+
|
231
|
+
if sub_node in graph_clr: # すでに着色済み
|
232
|
+
|
233
|
+
continue
|
234
|
+
|
235
|
+
if sub_node in graph_map[node]: # 現在のノードとつながっている
|
236
|
+
|
237
|
+
continue
|
238
|
+
|
239
|
+
# 隣接ノードがすでに同色で着色済み ※この条件が必要
|
240
|
+
|
241
|
+
if has_color(graph_map[sub_node],clr,graph_clr):
|
242
|
+
|
243
|
+
continue
|
244
|
+
|
245
|
+
graph_clr[sub_node] = clr
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
clr += 1
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
print(graph_clr) # {'C': 2, 'D': 0, 'E': 2, 'A': 0, 'G': 0, 'F': 1, 'B': 1, 'H': 2}
|
254
|
+
|
255
|
+
```
|