137. Gráfico de clonación

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; }



 

Supongo que te gusta

Origin blog.csdn.net/yinhua405/article/details/109065140
Recomendado
Clasificación