#python #graph
#python #График
Вопрос:
Я пытаюсь выполнить некоторый hw с помощью алгоритма Дейкстры, но у меня возникают проблемы с визуализацией того, что этот ввод хотел бы видеть в виде графика. Код написан на python. Что это за график?
example = [[(1, 1), (2, 2), (4, 3)], [(1, 3), (3, 4)], [(2, 3), (3, 5)], [(1, 4), (2, 5)], [], []]
Комментарии:
1. Вы можете представлять граф по-разному. Этот способ выглядит как список ребер.
2. Значит ли это, что 1 равен 1 длине из 2, что равно 2 длине из 4? @sashaaero
3. Это список списков кортежей. По сути, это не несет в себе большего значения, чем это. Чтобы убедиться, вам пришлось бы поговорить с человеком, который это написал, или прочитать какой-нибудь код, который работает с ним, или прочитать документацию об этом и т.д. Насколько нам известно, это могут быть лотерейные номера. Существует много возможных значений.
4. @rmcknst2 этот список действительно немного странный, список списков кортежей. Первоначально
(x, y)
означает, что узелx
имеет ребро кy
. Возможно, каждый внутренний список означает вес ребра, я действительно не могу знать.5. Если у вас действительно нет другой информации, вы можете принять индекс списка за вес (начинается с 1), а кортеж за ребро, но ребро (1, 1) с некоторым весом кажется странным.
Ответ №1:
Я предполагаю, что i
-й элемент списка example
представляет все ребра с весом i
. Вы можете изменить структуру данных графика на что-то другое, например, dict, где каждый ключ является узлом, а его значение — список узлов, к которым он подключен, с соответствующими весами.
example = [[(1, 1), (2, 2), (4, 3)], [(1, 3), (3, 4)], [(2, 3), (3, 5)], [(1, 4), (2, 5)], [], []]
nodes = list(set([i for k in example for j in k for i in j ]))
arcs = [(i,example.index(j)) for j in example for i in j]
example_graph = {str(i):[] for i in nodes}
for i in arcs:
example_graph[str(i[0][0])] = [(i[1],str(i[0][1]))]
print example_graph
Это дает
example_graph = {'1': [(0, '1'), (1, '3'), (3, '4')],
'2': [(0, '2'), (2, '3'), (3, '5')],
'3': [(1, '4'), (2, '5')],
'4': [(0, '3')],
'5': []}
Теперь вы можете реализовать алгоритм Дейкстры, вот пример, который я нашел :
from heapq import heappop,heappush
def dijkstra(s, t, neighbors):
M = set()
d = {s: 0}
p = {}
new = [(0, s)]
while new != []:
dx, x = heappop(new)
if x in M:
continue
M.add(x)
for w, y in neighbors(x):
if y in M:
continue
dy = dx w
if y not in d or d[y] > dy:
d[y] = dy
heappush(new, (dy, y))
p[y] = x
path = [t]
x = t
while x != s:
x = p[x]
path.insert(0, x)
return d[t], path
def neighbors(s,graph=example_graph):
return graph[s]
Например, dijkstra('1', '4', neighbors)
возвращает (2, ['1', '3', '4'])