Проверьте, является ли граф двудольным

#python #python-2.7 #numpy #graph #bipartite

#python #python-2.7 #numpy #График #двудольный

Вопрос:

итак, мне нужно проверить, является ли график двудольным, используя массивы Numpy и Python 2

Это код, который я разработал для проверки графика:

 from __future__ import print_function
import numpy as np

class grafo:
    visited = []

    def __init__(self, n):
        self.vertices = []
        self.adjacency = np.zeros((n,n))
        self.visited.append(True)
        self.size = n
        self.color = [-1] * self.size
        self.color.append(0)

    def isBipartita(self):
        finalRes = str()
        init = 0
        self.color[init] = 1
        self.visited.append(init)
        while self.visited: 
            i = self.visited.pop() 
            print("[FIRST CHECK] adyacencia["   str(i) "]["   str(i)   "] == 1?")
            if self.adjacency[i][i] == 1:  //HERE IT CORRUPTS AT SOME POINT
                finalRes = "NO"
                print("True")
                return finalRes; 

            for f in range(self.size): 
                print("[SECOND CHECK] adyacencia["   str(i) "]["   str(f)   "] == 1 and color["   str(f)  "] == -1")
                if self.adjacency[i][f] == 1 and self.color[f] == -1:
                    print("True")
                    self.color[f] = 1 - self.color[i] 
                    self.visited.append(f)
                else:
                    print("[THIRD CHECK] adyacencia["   str(i) "]["   str(f)   "] == 1 and color["   str(f)  "] == color["   str(i)  "]")
                    if self.adjacency[i][f] == 1 and self.color[f] == self.color[i]:
                        print("True")
                        finalRes = "NO"
                        return finalRes

        finalRes = "YES"
        return finalRes

    def __str__(self):
        return str(self.adjacency)


#PROGRAM

lenV = raw_input("") #This is the length of the Adjacency array for the graph
lenV = int(lenV)
inputs = []

for i in range(0, lenV):
    inputs.append(raw_input())

print("n-> Inputs:")
print(inputs)
print("n-> List with Inputs Values:")
tempVal = list()
for numC in inputs:
    tempVal.append(numC)

print(tempVal)

print("n-> Split and get into array:")
G = grafo(lenV)
for x in range(0,lenV):
    tempList = list(tempVal[x])
    print(tempList)
    for y in range(0, lenV):
        G.adjacency[x][y] = tempList[y]
print("n-> Array to check:")       
print(G)
print("n")
print(G.isBipartita())
  

Проблема заключается в классе «grafo» в методе isBipartita; в какой-то момент при проверке массив целых чисел numpy возвращает логическое значение и выдает ValueError в качестве выходных данных.

Вот несколько примеров, которые я использовал для тестирования этого:

 TEST CASES
3
011
101
110

4
0101
1010
0101
1010
  

и это результат, который я получаю:

 /** LIKE 20 SUCCESSFUL CHECKS LATER **/
[SECOND CHECK] adyacencia[1][3] == 1 and color[3] == -1
[THIRD CHECK] adyacencia[1][3] == 1 and color[3] == color[1]
[FIRST CHECK] adyacencia[True][True] == 1?
Traceback (most recent call last):
  File "bipartitaChecker.py", line 76, in <module>
    print(G.isBipartita())
  File "bipartitaChecker.py", line 23, in isBipartita
    if self.adjacency[i][i] == 1: 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
  

Как вы можете видеть, перед обратным вызовом трассировки последняя «[ПЕРВАЯ ПРОВЕРКА]» имеет adyacencia[True][Истина], и это не должно быть таким образом… Я провел исследование ValueError, но все приводит меня к тому, что эта ошибка появляется только в некоторых внешних случаях, но в моем случае она не должна быть ее причиной…

Я не знаю, что происходит?!

Я буду признателен за любую помощь.

Комментарии:

1. Если вы не делаете это исключительно для практики, я бы посоветовал заглянуть в библиотеку networkx. networkx.github.io/documentation/stable/reference/algorithms /…

2. Это сообщение об ошибке означает, что вы пытаетесь сравнить массив со скаляром. В данном случае self.adjacency[i][i] это массив, и поэтому при сравнении self.adjacency[i][i] == 1 вы получаете обратно массив.