титульный
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]