Определите, Как Долго График Будет Полностью Посещен

#python #algorithm #graph-theory

Вопрос:

Предположим, что население составляет 500 человек, и каждый человек знает ровно 4 других человека в населении. Предположим, один человек заражается болезнью, и эта болезнь гарантированно заразит остальных 4 человек, которых этот человек знает, ровно через 1 день.

Напишите алгоритм, чтобы определить, сколько дней потребуется всем, чтобы заразиться, учитывая входную матрицу смежности.

Я не могу понять, как правильно следить за днями. Я попробовал следующее, но это просто дает мне число, близкое к общему числу узлов (оно должно быть намного меньше).:

 import random
random.seed(20)

nodes = 500
num_connections = 4

# generate random graph
graph = []
for node_num in range(nodes):
  myrow = [0 for node in range(nodes - num_connections)]   [1 for connection in range(num_connections)]
  random.shuffle(myrow)
  graph.append(myrow)


days = 0
visited = [0]
queue = [0]
while queue:
  ss = queue.pop(0)
  for neighbor, is_connected in enumerate(graph[ss]):
    if is_connected == 1 and neighbor not in visited:
      visited.append(neighbor)
      queue.append(neighbor)
      days  = 1

print(days)
 

Что я делаю не так?

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

1. Вы можете поставить в очередь кортеж, состоящий из neighbor номера дня и номера дня. Таким образом, последний элемент, считанный из очереди, сообщает вам, сколько дней на это ушло. Или вы можете изменить способ работы visited списка. При i посещении узла установите visited[i] номер дня. Тогда вы знаете день для каждого узла и max(visited) количество дней, которые потребовались для завершения.

2. Нет никаких причин, по которым ваша «очередь» должна быть просто «человеком». Вместо этого ваша очередь может состоять из (человек, день, в который они заболевают).

Ответ №1:

  1. найдите самый длинный и короткий путь от первого зараженного человека к любому другому человеку, используя алгоритм Дейкстры.
  2. Длина этого пути-это количество дней.

Ответ №2:

ваша задача эквивалентна нахождению самого длинного кратчайшего маршрута на графике. но если вы хотите исправить свой текущий код, я исправил его для вас 🙂

 import random

random.seed(20)

nodes = 50
num_connections = 4

# generate random graph
graph = []
for node_num in range(nodes):
    myrow = [0 for node in range(nodes - num_connections)]   [1 for connection in range(num_connections)]
    random.shuffle(myrow)
    graph.append(myrow)

days = 0
visited = [0]
queue = [0]
while len(visited) < nodes:
    patients = queue.copy()
    queue.clear()
    days  = 1
    while len(patients) > 0:
        ss = patients.pop(0)
        for neighbor, is_connected in enumerate(graph[ss]):
            if is_connected == 1 and neighbor not in visited:
                visited.append(neighbor)
                queue.append(neighbor)
    if len(queue) == 0:
        print(f'The given directional graph is not connected, after {days} days, {len(visited)} persons has been infected')
        exit()

print(days)