
Дима — системный администратор в университете. Сейчас он разбирается с крупной проблемой —
некоторые из компьютеров в дисплейных классах дружественной университету школы заражены компьютерным вирусом. Антивирусное ПО не помогает — вирус слишком свежий... Дима нашёл компьютер, с которого началось заражение, после чего собрал лог по всем переданным по локальной сети пакетам. Выяснилось, что в случае, если компьютер получил данные от компьютера, зараженного вирусом, компьютер заражается (при этом если компьютер только отправлял данные на зараженный компьютер, заражения не происходит). Так как размер лога очень большой, Дима предлагает распараллелить усилия и просит Вас написать программу, которая определит список заражённых компьютеров (а сам он будет разбираться с тем, как обезвредить вирус на конкретном компьютере). Формат ввода Входные данные состоят из нескольких (не более 30) тестовых примеров. Первая строка каждого тестового примера содержит два целых числа N и M (0 < N ≤ 2 ⋅ 104, 0 ≤ M ≤ 2 ⋅ 104), где N — количество компьютеров в школьной сети и M — количество записей в логе о переданных пакетах данных. В последующих M строках задаются пакеты, по одному на строку. Каждый пакет задаётся тремя целыми числами ti, si и di — временем отправки пакета, номером компьютера, с которого был отправлен пакет и номером компьютера, на который был отправлен пакет, соответственно (0 ≤ ti ≤ 109, 1 ≤ si, di ≤ N, si ≠ di, все ti попарно различны). Компьютер, зараженный первым, имеет id 1. Входные данные завершаются строкой с двумя нулями. Обрабатывать эту строку как тестовый пример не требуется. Гарантируется, что объём входных данных не превосходит 5 мебибайт. Формат вывода Для каждого тестового примера выведите одно число — количество компьютеров, заражённых вирусом. Пример Ввод 3 2 1 1 2 2 2 3 3 2 2 3 2 1 2 1 0 0 Вывод 3 1

Ответы на вопрос

Программа ни питоне 3, наивно реализующая то, что написано в задаче:
while True:
n, m = map(int, input().split())
if n == 0:
break
infected = set([1])
log = [[int(i) for i in input().split()] for _ in range(m)]
log.sort(key=lambda x: x[0])
for entry in log:
if entry[1] in infected:
infected.add(entry[2])
print(len(infected))
Считываем n и m, если это не нули, идем дальше. Считываем лог, на всякий случай сортируем его так, чтобы записи шли в хронологическом порядке. Создаем множество зараженных компьютеров, затем для каждой записи в логе проверяем, был ли отправитель заражен, если да - добавляем получателя в список зараженных. В конце выводим количество зараженных компьютеров.



Для решения этой задачи, можно использовать алгоритм обхода графа в ширину (BFS), чтобы определить все компьютеры, которые могут быть заражены вирусом.
- Считываем входные данные.
- Создаем пустой список зараженных компьютеров.
- Создаем пустой словарь, который будет представлять сетевой граф. Ключами словаря будут номера компьютеров, а значениями - списки соседей (компьютеров, на которые передавались данные из данного компьютера).
- По логу переданных пакетов заполняем словарь соседей.
- Запускаем BFS, начиная с компьютера 1 (зараженного вирусом) и распространяемся по соседям для поиска всех зараженных компьютеров.
- После BFS получаем список зараженных компьютеров и выводим его длину.
Давайте реализуем это на Python:
pythonfrom collections import defaultdict, deque
def bfs_virus(graph, start):
infected = set()
queue = deque([start])
while queue:
computer = queue.popleft()
if computer not in infected:
infected.add(computer)
queue.extend(graph[computer])
return infected
def main():
while True:
N, M = map(int, input().split())
if N == 0 and M == 0:
break
graph = defaultdict(list)
for _ in range(M):
ti, si, di = map(int, input().split())
graph[si].append(di)
infected_computers = bfs_virus(graph, 1)
print(len(infected_computers))
if __name__ == "__main__":
main()
Теперь вы можете использовать эту программу для обработки входных данных из примера и получить соответствующий вывод:
Ввод 3 2 1 1 2 2 2 3 2 3 2 1 2 2 1 0 0 Вывод 3 1
Программа считывает вводные данные, обрабатывает каждый тестовый пример и выводит количество зараженных компьютеров для каждого примера. В этом примере, 1-ый тестовый пример имеет 3 зараженных компьютера, а 2-ой тестовый пример - 1 зараженный компьютер.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili