Некоторый завод умеет производить N=100000 различных видов деталей. В каталоге деталей, которые могут быть произведены на этом заводе, все они пронумерованы числами от 1 до N. При этом для производства некоторых деталей сначала нужно произвести какие-то другие детали. При этом детали «не расходуются», например, если для производства детали номер 6 нужны детали номер 7 и 8, а для производства детали номер 7 также нужна деталь номер 8, то для производства детали номер 6 нужно произвести детали номер 8, 7, 6 (деталь номер 8 будет использована и для производства детали номер 7, и для производства детали номер 6) по одному разу. То есть каждую деталь из каталога нужно произвести не более одного раза, или вообще можно не производить, если она не требуется. -Python(Питон)

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

ВХОДНЫЕ ДАННЫЕ

Первая строка входных данных содержит число n, (1≤n≤100000). Каждая из последующих n строк входного файла описывает характеристики производства деталей. Здесь i-я строка содержит список деталей, которые требуются для производства детали с номером i. В списке нет повторяющихся номеров деталей. Список может быть пустым: тогда ему будет соответствовать пустая строка!
Суммарно во всех списках содержится не более 200000 элементов. Гарантируется, что не существует циклических зависимостей в производстве деталей.
ВЫХОДНЫЕ ДАННЫЕ

Программа должна вывести одно натуральное число — минимальное количество деталей, которые должен произвести завод для производства детали номер 1.

ПРИМЕР

ввод

3
2

1 2

вывод

2

комментарий

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

ввод

6
3 6

4

2 6
4

вывод

4

комментарий

Для производства детали 1 нужны детали 3 и 6, каждая из них требует для производства деталь 4. Итого нужно произвести 4 детали (1, 3, 6, 4), детали 2 и 5 производить не нужно.

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

В данной задаче, граф представляет собой зависимости между деталями. Если деталь A требуется для производства детали B, то мы можем добавить ребро из вершины A в вершину B в графе.

Алгоритм топологической сортировки будет итеративно проходить по вершинам графа, начиная с детали номер 1, и подсчитывать минимальное количество деталей, которые необходимо произвести для производства детали номер 1.

Вот решение задачи на Python, используя алгоритм топологической сортировки:

from collections import deque

def min_parts(n, dependencies):
    # Создаем граф зависимостей
    graph = [[] for _ in range(n+1)]
    for i in range(1, n+1):
        for dep in dependencies[i]:
            graph[dep].append(i)
    
    # Инициализируем массив для хранения количества деталей
    parts_count = [0] * (n+1)
    
    # Очередь для обхода вершин в графе
    queue = deque()
    queue.append(1)  # Начинаем с детали номер 1
    
    # Итеративно обходим вершины графа
    while queue:
        part = queue.popleft()
        for dep in graph[part]:
            parts_count[dep] = max(parts_count[dep], parts_count[part] + 1)
            queue.append(dep)
    
    # Находим максимальное количество деталей
    max_count = max(parts_count)
    
    # Возвращаем минимальное количество деталей для производства детали номер 1
    return max_count + 1

# Считываем входные данные
n = int(input())
dependencies = {}
for i in range(1, n+1):
    dependencies[i] = list(map(int, input().split()))

# Вызываем функцию и выводим результат
result = min_parts(n, dependencies)
print(result)

В этом коде мы сначала создаем граф зависимостей, используя входные данные. Затем мы инициализируем массив parts_count для хранения количества деталей, и очередь queue для обхода вершин в графе.

Затем мы начинаем итеративно обходить вершины графа, начиная с детали номер 1. Для каждой вершины мы проверяем все ее зависимости и обновляем количество деталей, необходимых для их производства. Мы также добавляем зависимые детали в очередь для дальнейшего обхода.

В конце мы находим максимальное количество деталей в массиве parts_count и возвращаем это значение, увеличенное на 1, так как входная деталь (номер 1) также должна быть произведена.

Пример реализации 2:

def parts(n=0):
    nl.add(str(n + 1))
    if ml[n]:
        for i in ml[n]:
            parts(int(i)-1)
    return len(nl)
 
n = int(input())
ml = [input().split() for _ in range(n)]
nl = set()
 
print(parts())

Leave a Comment