Дан простой неориентированный граф с вершинами в формате списка ребер.Возврат: для каждого графа выведите «1», если он содержит простой цикл (то есть цикл, который не пересекает себя) длины 4 и «-1» в противном случае.Я не понимаю основной механизм, умножая граф (в матрице смежности) сам по себе, тогда мы знаем, содержит ли граф квадратный цикл через недиагональные элементы> 1.
Я преобразовал граф в смежностьматричный формат, а затем сделал матричное умножение.
# graph is in edge list format
# 4 5
# 3 4
# 4 2
# 3 2
# 3 1
# 1 2
def adjacency_matrix(g):
keys = sorted(g.keys())
size = len(keys)
m = [[0] * size for i in range(size)]
for a, b in [(keys.index(a), keys.index(b)) for a, row in g.items()
for b in row]:
m[a][b] = 0 if (a == b) else 1
return m
def square_existence(graph):
adjacency_matrix(graph)
matrix = np.dot(graph, graph)
size = len(matrix)
return any([i != j and matrix[i][j] > 1 for j in range(size) for i in
range(size)])
Результат равен 1, что означает, что он содержит квадратный цикл.