2016-11-17 11 views
0

Код:Использование BFS раскраски алгоритм для проверки, если граф двудольный в Python

def bipartite(G): 
    open_list = [1] 
    colors = {} 
    color_counter = 0 
    # assign a color to the first node being visited 
    colors[1] = 0 

    while open_list: 
     # up the counter here so that all neighbors get the same color 
     color_counter += 1 
     # use first elem for bfs 
     current_neighbors = G[open_list[0]] 
     current_color = color_counter % 2 
     # prints used for debugging 
     print open_list 
     print "The current color is: %s" % (current_color,) 
     for neighbor in current_neighbors: 
      if neighbor not in colors: 
       open_list.append(neighbor) 
       colors[neighbor] = current_color 
       # print used for debugging 
       print "parent is: %s, child is: %s, %s's color is: %s" \ 
       % (open_list[0], neighbor, neighbor, colors[neighbor]) 
       # print used for debugging 
      else: print "parent is: %s, child is: %s, already colored: %s" \ 
       % (open_list[0], neighbor, colors[neighbor]) 
     open_list.pop(0) 
    # now, return array of values that has one of the two colors 
    zeros_array = [] 
    ones_array = [] 
    for key in colors.keys(): 
     if colors[key] == 0: 
      zeros_array.append(key) 
     else: 
      ones_array.append(key) 

    if len(set(zeros_array) & set(ones_array)) == 0: 
     return zeros_array 
    else: 
     return None 

Вот граф Я использую:

{1: {2: 1, 4: 1}, 2: {1: 1, 3: 1, 5: 1}, 3: {8: 1, 2: 1}, 4: {1: 1}, 5: {2: 1, 6: 1}, 6: {5: 1}, 8: {3: 1}} 

Я вытащил его и граф можно представить в виде дерево с 1 в качестве корня и отходит к узлам 2 и 4, где 4 - лист, но 2 продолжается. Я использую счетчик цветов для цветных соседей одного и того же цвета (0 или 1). 2 и 4 дают один и тот же цвет, тогда алгоритм правильно дает 3 и 5 противоположный цвет их родителя 2, но при возврате одного уровня до проверки 4 счетчик цветов увеличивается, поэтому к моменту, когда он достигает 8, 8 получает неправильный цвет.

Я застрял в том, как лучше всего исправить это.

ответ

0

Вы должны выбрать цвет в зависимости от вашего текущего цвета вершины, что-то вроде colors[neighbor] = (colors[open_list[0]] + 1) % 2

Кроме того, len(set(zeros_array) & set(ones_array)) == 0 всегда будет true, так что вы не проверить двудольный прошло хорошо. Вы можете проверить его в другом ветке if neighbor not in colors:: просто утвердите, что ваш сосед имеет другой цвет с текущей вершиной.

+0

Изменена ваша линия до: colors [neighbour] = (colors [open_list [0]] + 1)% 2, и это сработало. Не могли бы вы туда добраться без вас, спасибо! –

+0

Да, я ошибся – mingaleg

 Смежные вопросы

  • Нет связанных вопросов^_^