[LeetCode in Python] 133 (M) граф клонов граф клонов

титульный

https://leetcode-cn.com/problems/clone-graph/

Чтобы дать вам ссылку на узел в графе, вернитесь к глубокой копии (клону) графа.
Каждый узел в графе содержит свое значение val (int) и свой список соседей (list [Node]).

class Node {
    public int val;
    public List<Node> neighbors;
}

Формат теста:

Для простоты значение каждого узла совпадает с его индексом. Например, значение первого узла равно 1 (val = 1), значение второго узла равно 2 (val = 2) и т. Д.
Эта цифра представлена ​​списком смежности в тестовых примерах.

Список смежности представляет собой набор неупорядоченных списков, используемых для представления конечных графов. Каждый список описывает соседний набор узлов в графе.
Данный узел всегда будет первым узлом на графике (значение 1). Вы должны вернуть копию данного узла в качестве ссылки на клонированный граф.

Пример 1:

Входные данные: adjList = [[2,4], [1,3], [2,4], [1,3]]
Выходные данные: [[2,4], [1,3], [2,4], [1,3]]

Пояснение:
на графике 4 узла.
Значение узла 1 равно 1, и у него есть два соседа: узлы 2 и 4.
Значение узла 2 равно 2, и у него есть два соседа: узлы 1 и 3.
Значение узла 3 равно 3, и у него есть два соседа: узлы 2 и 4.
Значение узла 4 равно 4, и у него есть два соседа: узлы 1 и 3.

Пример 2:

Входные данные: adjList = [[]]
Выходные данные: [[]]

Объяснение: Вход содержит пустой список. Граф имеет только один узел со значением 1 и не имеет соседей.

Пример 3:

Входные данные: adjList = []
Выходные данные: []

Объяснение: Этот график пуст, он не содержит узлов.

Пример 4:

Входные данные: adjList = [[2], [1]]
Выходные данные: [[2], [1]]

Советы:

Количество узлов не превышает 100.
Каждое значение узла Node.val уникально, 1 <= Node.val <= 100.
Ненаправленный граф - это простой граф, что означает, что в нем нет повторяющихся ребер и нет собственных петель.
Поскольку граф является ненаправленным, если узел p является соседом узла q, то узел q также должен быть соседом узла p.
Граф является связным графом, вы можете получить доступ ко всем узлам из данного узла.

Идеи решения проблем

  • Такое чувство, что BFS прост и груб, писать лучше, чем DFS
  • Используйте словарь для хранения сопоставления старых узлов новым узлам
  • Этот словарь также может быть использован для записи, какие старые узлы были посещены

код

"""
# Definition for a Node.
class Node:
    def __init__(self, val = 0, neighbors = []):
        self.val = val
        self.neighbors = neighbors
"""

class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        if node is None: 
            return None

        # - map old node to new node
        map_dict = {node:Node(node.val, [])}
        q = deque()
        q.append(node)

        # - BFS
        while q:
            nd = q.popleft()

            for nei in nd.neighbors:
                if nei not in map_dict:
                    # - create and map to new node
                    map_dict[nei] = Node(nei.val, [])
                    q.append(nei)

                # - update map
                map_dict[nd].neighbors.append(map_dict[nei] )

        return map_dict[node]
        

рекомендация

отwww.cnblogs.com/journeyonmyway/p/12717227.html
рекомендация