回答編集履歴

1

修正

2019/01/10 08:03

投稿

can110
can110

スコア38262

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
+ ```