137. Gráfico de clonación
Clonar un gráfico no dirigido. Cada nodo del gráfico no dirigido contiene una etiqueta y una lista de vecinos. Asegúrese de que la etiqueta de cada nodo sea diferente entre sí.
Su programa tiene que devolver un nuevo plan después de una copia en profundidad del nuevo mapa y la obra tiene la misma estructura, y cualquier cambio en el nuevo plan no tendrá ningún impacto en la imagen original.
Muestra
Ejemplo 1
Entrada:
{1,2,4 # 2,1,4 # 4,1,2}
Salida:
{1,2,4 # 2,1,4 # 4,1,2}
Explicación:
1 ----- -2
\ |
\ |
\ |
\ |
4
struct UndirectedGraphNode
{ int etiqueta; vecinos del vector <UndirectedGraphNode *>; UndirectedGraphNode (int x): etiqueta (x) {}; };
UndirectedGraphNode * cloneGraph (UndirectedGraphNode * nodo)
{ if (nodo == nullptr) { return nullptr; }
vector <UndirectedGraphNode *> newNodeVec;
vector <UndirectedGraphNode *> visitedNodeVec;
cola <UndirectedGraphNode *> queNodeQue;
UndirectedGraphNode * cabeza = nuevo UndirectedGraphNode (node-> etiqueta);
newNodeVec.push_back (cabeza); // tienda nuevo
queNodeQue.push (nodo ); // almacena el original
visitado NodeVec.push_back (nodo);
while (verdadero)
{ UndirectedGraphNode * tmpNode = nullptr; UndirectedGraphNode * newNode = nullptr; if (queNodeQue.empty ()) break; tmpNode = queNodeQue.front (); queNodeQue.pop (); // 出 队
for (int i = 0; i <newNodeVec.size (); i ++)
{ if (newNodeVec [i] -> etiqueta == tmpNode-> etiqueta) { newNode = newNodeVec [i]; romper; } } if (nullptr == newNode) { romper; }
for (int i = 0; i <tmpNode-> vecinos.size (); i ++)
{ UndirectedGraphNode * neighNode = tmpNode-> vecinos [i]; bool bFindVisited = false; for (int i = 0; i <visitadoNodeVec.size (); i ++) { if (visitadoNodeVec [i] -> etiqueta == neighNode-> etiqueta) { bFindVisited = true; romper; } } if (falso == bFindVisited) // 没有 访问 过 { VisitNodeVec.push_back (neighNode); queNodeQue.push (neighNode); // 存储 节点 的 邻 节点
UndirectedGraphNode * tmp = nuevo UndirectedGraphNode (neighNode-> etiqueta); // 创建 新 的 节点
newNodeVec.push_back (tmp); // 存储 新 的
newNode-> vecinos.push_back (tmp);
}
else
{ UndirectedGraphNode * findNode = nullptr; for (int i = 0; i <newNodeVec.size (); i ++) { if (newNodeVec [i] -> etiqueta == neighNode-> etiqueta) { findNode = newNodeVec [i]; romper; } } newNode-> vecinos.push_back (findNode);
}
}
}
cabeza de retorno;
}
prueba nula ()
{ // {1, 2, 4 # 2, 1, 4 # 4, 1, 2}
UndirectedGraphNode * node1 = nuevo UndirectedGraphNode (1);
UndirectedGraphNode * node2 = nuevo UndirectedGraphNode (2);
UndirectedGraphNode * node3 = nuevo UndirectedGraphNode (4);
nodo1-> vecinos.push_back (nodo2);
nodo1-> vecinos.push_back (nodo3);
nodo2-> vecinos.push_back (nodo1);
nodo2-> vecinos.push_back (nodo3);
nodo3-> vecinos.push_back (nodo2);
nodo3-> vecinos.push_back (nodo1);
UndirectedGraphNode * ret = cloneGraph (nodo1);
}
int main ()
{ prueba (); getchar (); return 0; }