Клонирајте неусмерени граф

Клонирајте неусмерени граф
Пробајте на ГфГ пракси Клонирајте неусмерени граф

С обзиром на а  повезани неусмерени граф  представљена суседном листом  адјЛист[][]  са  н  чворови и  м  ивице са сваким чвором који има а  различита ознака  из  0 до н-1 и сваки адј[и] представља листу врхова повезаних са врхом и.

Направите а  клон  графа где сваки чвор у графу садржи цео број  вал  и низ ( комшије ) чворова   који садржи чворове који су суседни тренутном чвору.

класа чвор {
вал: цео број
комшије: листа[чвор]
}

Ваш задатак је да клонирате дати граф и вратите референцу на клонирани граф.

Напомена: Ако вратите исправну копију датог графикона, излаз ће бити истинит; у супротном, ако копија није тачна, штампаће се нетачно.

Примери

Улаз: н = 4 адјЛист[][] = [[1 2] [0 2] [0 1 3] [2]]
Излаз: истина
Објашњење:
Клонирајте неусмерени граф
Пошто је клонирани графикон идентичан оригиналном, излаз ће бити истинит.

Улаз: н = 3 адјЛист[][] = [[1 2] [0] [0]]
Излаз: истина
Објашњење:
Пошто је клонирани графикон идентичан оригиналном, излаз ће бити истинит.

Садржај

Зашто треба да пратимо посећене/клониране чворове?

Морамо да пратимо посећене или клониране чворове да бисмо избегли бесконачну рекурзију и сувишан рад приликом клонирања графа. Пошто графови могу да садрже циклусе (где чвор може да укаже на претходно посећени чвор) без праћења чворова које смо већ клонирали, функција клонирања би бескрајно поново посећивала исте чворове што би резултирало преливањем стека или нетачним дуплирањем.

Како пратити посећене/клониране чворове?

ХасхМап/Мап је потребан да би се одржали сви чворови који су већ креирани. Продавнице кључева : Референца/Адреса оригиналног чвора Продавнице вредности : Референца/Адреса клонираног чвора Направљена је копија свих чворова графа.

Како повезати клониране чворове?

Приликом посете суседним врховима а чвор ин добити одговарајући клонирани чвор за вас да то назовемо ИН сада посетите све суседне чворове за ин и за сваког суседа пронађите одговарајући клонски чвор (ако није пронађен креирајте га) и затим гурните у суседни вектор ИН чвор. 

Како проверити да ли је клонирани графикон тачан?

Извршите БФС прелазак на оригинални граф пре клонирања, а затим поново на клонирани граф након што је клонирање завршено. Током сваког обиласка одштампајте вредност сваког чвора заједно са његовом адресом (или референцом). Да бисте проверили исправност клонирања, упоредите редослед чворова посећених у оба обиласка. Ако се вредности чворова појављују у истом редоследу, али се њихове адресе (или референце) разликују, то потврђује да је граф успешно и исправно клониран.

Истражите како да клонирати неусмерени граф укључујући графове са више повезаних компоненти користећи БФС или ДФС да бисте обезбедили потпуну дубоку копију свих чворова и ивица.

[Приступ 1] Коришћење БФС преласка - О(В+Е) време и О(В) простор

У БФС приступу граф се клонира итеративно коришћењем реда. Почињемо клонирањем почетног чвора и стављањем у ред. Док обрађујемо сваки чвор из реда, посећујемо његове суседе. Ако сусед још увек није клониран, креирамо клон који га чувамо на мапи и стављамо у ред за каснију обраду. Затим додајемо клон суседа на листу суседа клонова тренутног чвора. Овај процес се наставља ниво по ниво обезбеђујући да се сви чворови посећују по редоследу у ширину. БФС је посебно користан за избегавање дубоке рекурзије и ефикасно руковање великим или широким графовима.

C++
   #include          #include         #include         #include         using     namespace     std  ;   // Definition for a Node   struct     Node     {      int     val  ;      vector   <  Node  *>     neighbors  ;   };   // Clone the graph    Node  *     cloneGraph  (  Node  *     node  )     {      if     (  !  node  )     return     nullptr  ;      map   <  Node  *       Node  *>     mp  ;      queue   <  Node  *>     q  ;          // Clone the source node      Node  *     clone     =     new     Node  ();      clone  ->  val     =     node  ->  val  ;      mp  [  node  ]     =     clone  ;      q  .  push  (  node  );      while     (  !  q  .  empty  ())     {      Node  *     u     =     q  .  front  ();      q  .  pop  ();      for     (  auto     neighbor     :     u  ->  neighbors  )     {          // Clone neighbor if not already cloned      if     (  mp  .  find  (  neighbor  )     ==     mp  .  end  ())     {      Node  *     neighborClone     =     new     Node  ();      neighborClone  ->  val     =     neighbor  ->  val  ;      mp  [  neighbor  ]     =     neighborClone  ;      q  .  push  (  neighbor  );      }      // Link clone of neighbor to clone of current node      mp  [  u  ]  ->  neighbors  .  push_back  (  mp  [  neighbor  ]);      }      }      return     mp  [  node  ];   }   // Build graph   Node  *     buildGraph  ()     {      Node  *     node1     =     new     Node  ();     node1  ->  val     =     0  ;      Node  *     node2     =     new     Node  ();     node2  ->  val     =     1  ;      Node  *     node3     =     new     Node  ();     node3  ->  val     =     2  ;      Node  *     node4     =     new     Node  ();     node4  ->  val     =     3  ;      node1  ->  neighbors     =     {  node2       node3  };      node2  ->  neighbors     =     {  node1       node3  };      node3  ->  neighbors     =     {  node1       node2       node4  };      node4  ->  neighbors     =     {  node3  };      return     node1  ;   }       // Compare two graphs for structural and value equality   bool     compareGraphs  (  Node  *     node1       Node  *     node2           map   <  Node  *       Node  *>&     visited  )     {      if     (  !  node1     ||     !  node2  )         return     node1     ==     node2  ;          if     (  node1  ->  val     !=     node2  ->  val     ||     node1     ==     node2  )      return     false  ;      visited  [  node1  ]     =     node2  ;      if     (  node1  ->  neighbors  .  size  ()     !=     node2  ->  neighbors  .  size  ())         return     false  ;      for     (  size_t     i     =     0  ;     i      <     node1  ->  neighbors  .  size  ();     ++  i  )     {      Node  *     n1     =     node1  ->  neighbors  [  i  ];      Node  *     n2     =     node2  ->  neighbors  [  i  ];      if     (  visited  .  count  (  n1  ))     {      if     (  visited  [  n1  ]     !=     n2  )         return     false  ;      }     else     {      if     (  !  compareGraphs  (  n1       n2       visited  ))      return     false  ;      }      }      return     true  ;   }   // Driver Code   int     main  ()     {      Node  *     original     =     buildGraph  ();      Node  *     cloned     =     cloneGraph  (  original  );      map   <  Node  *       Node  *>     visited  ;      cout      < <     (  compareGraphs  (  original       cloned       visited  )     ?         'true'     :     'false'  )      < <     endl  ;      return     0  ;   }   
Java
   import     java.util.*  ;   // Definition for a Node   class   Node     {      public     int     val  ;      public     ArrayList   <  Node  >     neighbors  ;      public     Node  ()     {      neighbors     =     new     ArrayList   <>  ();      }      public     Node  (  int     val  )     {      this  .  val     =     val  ;      neighbors     =     new     ArrayList   <>  ();      }   }   public     class   GfG     {      // Clone the graph      public     static     Node     cloneGraph  (  Node     node  )     {      if     (  node     ==     null  )     return     null  ;      Map   <  Node       Node  >     mp     =     new     HashMap   <>  ();      Queue   <  Node  >     q     =     new     LinkedList   <>  ();      // Clone the starting node      Node     clone     =     new     Node  (  node  .  val  );      mp  .  put  (  node       clone  );      q  .  offer  (  node  );      while     (  !  q  .  isEmpty  ())     {      Node     current     =     q  .  poll  ();      for     (  Node     neighbor     :     current  .  neighbors  )     {      // Clone neighbor if it hasn't been cloned yet      if     (  !  mp  .  containsKey  (  neighbor  ))     {      mp  .  put  (  neighbor       new     Node  (  neighbor  .  val  ));      q  .  offer  (  neighbor  );      }      // Add the clone of the neighbor to the current node's clone      mp  .  get  (  current  ).  neighbors  .  add  (  mp  .  get  (  neighbor  ));      }      }      return     mp  .  get  (  node  );      }      // Build graph      public     static     Node     buildGraph  ()     {      Node     node1     =     new     Node  (  0  );      Node     node2     =     new     Node  (  1  );      Node     node3     =     new     Node  (  2  );      Node     node4     =     new     Node  (  3  );      node1  .  neighbors  .  addAll  (  new     ArrayList   <>      (  Arrays  .  asList  (  node2       node3  )));      node2  .  neighbors  .  addAll  (  new     ArrayList   <>      (  Arrays  .  asList  (  node1       node3  )));      node3  .  neighbors  .  addAll  (  new     ArrayList   <>      (  Arrays  .  asList  (  node1       node2       node4  )));      node4  .  neighbors  .  addAll  (  new     ArrayList   <>      (  Arrays  .  asList  (  node3  )));      return     node1  ;      }      // Compare two graphs for structure and value      public     static     boolean     compareGraphs  (  Node     n1       Node     n2           HashMap   <  Node       Node  >     visited  )     {      if     (  n1     ==     null     ||     n2     ==     null  )      return     n1     ==     n2  ;      if     (  n1  .  val     !=     n2  .  val     ||     n1     ==     n2  )      return     false  ;      visited  .  put  (  n1       n2  );      if     (  n1  .  neighbors  .  size  ()     !=     n2  .  neighbors  .  size  ())      return     false  ;      for     (  int     i     =     0  ;     i      <     n1  .  neighbors  .  size  ();     i  ++  )     {      Node     neighbor1     =     n1  .  neighbors  .  get  (  i  );      Node     neighbor2     =     n2  .  neighbors  .  get  (  i  );      if     (  visited  .  containsKey  (  neighbor1  ))     {      if     (  visited  .  get  (  neighbor1  )     !=     neighbor2  )      return     false  ;      }     else     {      if     (  !  compareGraphs  (  neighbor1       neighbor2       visited  ))      return     false  ;      }      }      return     true  ;      }      public     static     void     main  (  String  []     args  )     {      Node     original     =     buildGraph  ();      Node     cloned     =     cloneGraph  (  original  );      boolean     isEqual     =     compareGraphs  (  original       cloned        new     HashMap   <>  ());      System  .  out  .  println  (  isEqual     ?     'true'     :     'false'  );      }   }   
Python
   from   collections   import   deque   # Definition for a Node   class   Node  :   def   __init__  (  self     val  =  0  ):   self  .  val   =   val   self  .  neighbors   =   []   # Clone the graph   def   cloneGraph  (  node  ):   if   not   node  :   return   None   # Map to hold original nodes as keys and their clones as values   mp   =   {}   # Initialize BFS queue   q   =   deque  ([  node  ])   # Clone the starting node   mp  [  node  ]   =   Node  (  node  .  val  )   while   q  :   current   =   q  .  popleft  ()   for   neighbor   in   current  .  neighbors  :   # If neighbor not cloned yet   if   neighbor   not   in   mp  :   mp  [  neighbor  ]   =   Node  (  neighbor  .  val  )   q  .  append  (  neighbor  )   # Link clone of neighbor to the clone of the current node   mp  [  current  ]  .  neighbors  .  append  (  mp  [  neighbor  ])   return   mp  [  node  ]   # Build graph   def   buildGraph  ():   node1   =   Node  (  0  )   node2   =   Node  (  1  )   node3   =   Node  (  2  )   node4   =   Node  (  3  )   node1  .  neighbors   =   [  node2     node3  ]   node2  .  neighbors   =   [  node1     node3  ]   node3  .  neighbors   =   [  node1     node2     node4  ]   node4  .  neighbors   =   [  node3  ]   return   node1   # Compare two graphs structurally and by values   def   compareGraphs  (  n1     n2     visited  ):   if   not   n1   or   not   n2  :   return   n1   ==   n2   if   n1  .  val   !=   n2  .  val   or   n1   is   n2  :   return   False   visited  [  n1  ]   =   n2   if   len  (  n1  .  neighbors  )   !=   len  (  n2  .  neighbors  ):   return   False   for   i   in   range  (  len  (  n1  .  neighbors  )):   neighbor1   =   n1  .  neighbors  [  i  ]   neighbor2   =   n2  .  neighbors  [  i  ]   if   neighbor1   in   visited  :   if   visited  [  neighbor1  ]   !=   neighbor2  :   return   False   else  :   if   not   compareGraphs  (  neighbor1     neighbor2     visited  ):   return   False   return   True   # Driver   if   __name__   ==   '__main__'  :   original   =   buildGraph  ()   cloned   =   cloneGraph  (  original  )   result   =   compareGraphs  (  original     cloned     {})   print  (  'true'   if   result   else   'false'  )   
C#
   using     System  ;   using     System.Collections.Generic  ;   // Definition for a Node   public     class     Node     {      public     int     val  ;      public     List   <  Node  >     neighbors  ;      public     Node  ()     {      neighbors     =     new     List   <  Node  >  ();      }      public     Node  (  int     val  )     {      this  .  val     =     val  ;      neighbors     =     new     List   <  Node  >  ();      }   }   class     GfG     {          // Clone the graph       public     static     Node     CloneGraph  (  Node     node  )     {      if     (  node     ==     null  )         return     null  ;      var     mp     =     new     Dictionary   <  Node       Node  >  ();      var     q     =     new     Queue   <  Node  >  ();      // Clone the starting node      var     clone     =     new     Node  (  node  .  val  );      mp  [  node  ]     =     clone  ;      q  .  Enqueue  (  node  );      while     (  q  .  Count     >     0  )     {      var     current     =     q  .  Dequeue  ();      foreach     (  var     neighbor     in     current  .  neighbors  )     {      // If neighbor not cloned clone it and enqueue      if     (  !  mp  .  ContainsKey  (  neighbor  ))     {      mp  [  neighbor  ]     =     new     Node  (  neighbor  .  val  );      q  .  Enqueue  (  neighbor  );      }      // Add clone of neighbor to clone of current      mp  [  current  ].  neighbors  .  Add  (  mp  [  neighbor  ]);      }      }      return     mp  [  node  ];      }      // Build graph      public     static     Node     BuildGraph  ()     {      var     node1     =     new     Node  (  0  );      var     node2     =     new     Node  (  1  );      var     node3     =     new     Node  (  2  );      var     node4     =     new     Node  (  3  );      node1  .  neighbors  .  AddRange  (  new  []     {     node2       node3     });      node2  .  neighbors  .  AddRange  (  new  []     {     node1       node3     });      node3  .  neighbors  .  AddRange  (  new  []     {     node1       node2       node4     });      node4  .  neighbors  .  AddRange  (  new  []     {     node3     });      return     node1  ;      }      // Compare two graphs for structure and value      public     static     bool     CompareGraphs  (  Node     n1       Node     n2       Dictionary   <  Node       Node  >     visited  )     {      if     (  n1     ==     null     ||     n2     ==     null  )         return     n1     ==     n2  ;          if     (  n1  .  val     !=     n2  .  val     ||     ReferenceEquals  (  n1       n2  ))         return     false  ;      visited  [  n1  ]     =     n2  ;      if     (  n1  .  neighbors  .  Count     !=     n2  .  neighbors  .  Count  )         return     false  ;      for     (  int     i     =     0  ;     i      <     n1  .  neighbors  .  Count  ;     i  ++  )     {      var     neighbor1     =     n1  .  neighbors  [  i  ];      var     neighbor2     =     n2  .  neighbors  [  i  ];      if     (  visited  .  ContainsKey  (  neighbor1  ))     {      if     (  !  ReferenceEquals  (  visited  [  neighbor1  ]     neighbor2  ))         return     false  ;      }     else     {      if     (  !  CompareGraphs  (  neighbor1       neighbor2       visited  ))      return     false  ;      }      }      return     true  ;      }      public     static     void     Main  ()     {      var     original     =     BuildGraph  ();      var     cloned     =     CloneGraph  (  original  );      var     visited     =     new     Dictionary   <  Node       Node  >  ();      Console  .  WriteLine  (  CompareGraphs  (  original       cloned       visited  )         ?     'true'     :     'false'  );      }   }   
JavaScript
   // Definition for a Node   class     Node     {      constructor  (  val     =     0  )     {      this  .  val     =     val  ;      this  .  neighbors     =     [];      }   }   // Clone the graph   function     cloneGraph  (  node  )     {      if     (  !  node  )     return     null  ;      const     mp     =     new     Map  ();      const     q     =     [  node  ];      // Clone the initial node      mp  .  set  (  node       new     Node  (  node  .  val  ));      while     (  q  .  length     >     0  )     {      const     current     =     q  .  shift  ();      for     (  const     neighbor     of     current  .  neighbors  )     {      if     (  !  mp  .  has  (  neighbor  ))     {      mp  .  set  (  neighbor       new     Node  (  neighbor  .  val  ));      q  .  push  (  neighbor  );      }      // Link clone of neighbor to clone of current      mp  .  get  (  current  ).  neighbors  .  push  (  mp  .  get  (  neighbor  ));      }      }      return     mp  .  get  (  node  );   }   // Build graph   function     buildGraph  ()     {      const     node1     =     new     Node  (  0  );      const     node2     =     new     Node  (  1  );      const     node3     =     new     Node  (  2  );      const     node4     =     new     Node  (  3  );      node1  .  neighbors     =     [  node2       node3  ];      node2  .  neighbors     =     [  node1       node3  ];      node3  .  neighbors     =     [  node1       node2       node4  ];      node4  .  neighbors     =     [  node3  ];      return     node1  ;   }   // Compare two graphs structurally and by value   function     compareGraphs  (  n1       n2       visited     =     new     Map  ())     {      if     (  !  n1     ||     !  n2  )         return     n1     ===     n2  ;          if     (  n1  .  val     !==     n2  .  val     ||     n1     ===     n2  )         return     false  ;      visited  .  set  (  n1       n2  );      if     (  n1  .  neighbors  .  length     !==     n2  .  neighbors  .  length  )         return     false  ;      for     (  let     i     =     0  ;     i      <     n1  .  neighbors  .  length  ;     i  ++  )     {      const     neighbor1     =     n1  .  neighbors  [  i  ];      const     neighbor2     =     n2  .  neighbors  [  i  ];      if     (  visited  .  has  (  neighbor1  ))     {      if     (  visited  .  get  (  neighbor1  )     !==     neighbor2  )         return     false  ;          }     else     {      if     (  !  compareGraphs  (  neighbor1       neighbor2       visited  ))      return     false  ;          }      }      return     true  ;   }   // Driver   const     original     =     buildGraph  ();   const     cloned     =     cloneGraph  (  original  );   const     result     =     compareGraphs  (  original       cloned  );   console  .  log  (  result     ?     'true'     :     'false'  );   

Излаз
true  

[Приступ 2] Коришћење ДФС преласка - О(В+Е) време и О(В) простор

У ДФС приступу граф се клонира коришћењем рекурзије. Почињемо од датог чвора и истражујемо што је даље могуће дуж сваке гране пре него што се вратимо назад. Мапа (или речник) се користи за праћење већ клонираних чворова како би се избегла обрада истог чвора више пута и за руковање циклусима. Када први пут наиђемо на чвор, креирамо његов клон и чувамо га на мапи. Затим за сваки сусед тог чвора рекурзивно га клонирамо и додајемо клонираног суседа клону тренутног чвора. Ово осигурава да се сви чворови дубоко посећују пре враћања и да је структура графа верно копирана.

C++
   #include          #include         #include         #include         using     namespace     std  ;   // Definition for a Node   struct     Node     {      int     val  ;      vector   <  Node  *>     neighbors  ;   };   // Map to hold original node to its copy   unordered_map   <  Node  *       Node  *>     copies  ;   // Function to clone the graph    Node  *     cloneGraph  (  Node  *     node  )     {          // If the node is NULL return NULL      if     (  !  node  )     return     NULL  ;      // If node is not yet cloned clone it      if     (  copies  .  find  (  node  )     ==     copies  .  end  ())     {      Node  *     clone     =     new     Node  ();      clone  ->  val     =     node  ->  val  ;      copies  [  node  ]     =     clone  ;      // Recursively clone neighbors      for     (  Node  *     neighbor     :     node  ->  neighbors  )     {      clone  ->  neighbors  .  push_back  (  cloneGraph  (  neighbor  ));      }      }      // Return the clone      return     copies  [  node  ];   }   // Build graph   Node  *     buildGraph  ()     {      Node  *     node1     =     new     Node  ();     node1  ->  val     =     0  ;      Node  *     node2     =     new     Node  ();     node2  ->  val     =     1  ;      Node  *     node3     =     new     Node  ();     node3  ->  val     =     2  ;      Node  *     node4     =     new     Node  ();     node4  ->  val     =     3  ;      node1  ->  neighbors     =     {  node2       node3  };      node2  ->  neighbors     =     {  node1       node3  };      node3  ->  neighbors     =     {  node1    node2       node4  };      node4  ->  neighbors     =     {  node3  };      return     node1  ;   }   // Compare two graphs for structural and value equality   bool     compareGraphs  (  Node  *     node1       Node  *     node2       map   <  Node  *       Node  *>&     visited  )     {      if     (  !  node1     ||     !  node2  )         return     node1     ==     node2  ;      if     (  node1  ->  val     !=     node2  ->  val     ||     node1     ==     node2  )      return     false  ;      visited  [  node1  ]     =     node2  ;      if     (  node1  ->  neighbors  .  size  ()     !=     node2  ->  neighbors  .  size  ())         return     false  ;      for     (  size_t     i     =     0  ;     i      <     node1  ->  neighbors  .  size  ();     ++  i  )     {      Node  *     n1     =     node1  ->  neighbors  [  i  ];      Node  *     n2     =     node2  ->  neighbors  [  i  ];      if     (  visited  .  count  (  n1  ))     {      if     (  visited  [  n1  ]     !=     n2  )         return     false  ;      }     else     {      if     (  !  compareGraphs  (  n1       n2       visited  ))      return     false  ;      }      }      return     true  ;   }   // Driver Code   int     main  ()     {      Node  *     original     =     buildGraph  ();      // Clone the graph      Node  *     cloned     =     cloneGraph  (  original  );      // Compare original and cloned graph      map   <  Node  *       Node  *>     visited  ;      cout      < <     (  compareGraphs  (  original       cloned       visited  )     ?         'true'     :     'false'  )      < <     endl  ;      return     0  ;   }   
Java
   import     java.util.*  ;   // Definition for a Node   class   Node     {      int     val  ;      ArrayList   <  Node  >     neighbors  ;      Node  ()     {      neighbors     =     new     ArrayList   <>  ();      }      Node  (  int     val  )     {      this  .  val     =     val  ;      neighbors     =     new     ArrayList   <>  ();      }   }   public     class   GfG     {      // Map to hold original node to its copy      static     HashMap   <  Node       Node  >     copies     =     new     HashMap   <>  ();      // Function to clone the graph using DFS      public     static     Node     cloneGraph  (  Node     node  )     {      // If the node is NULL return NULL      if     (  node     ==     null  )     return     null  ;      // If node is not yet cloned clone it      if     (  !  copies  .  containsKey  (  node  ))     {      Node     clone     =     new     Node  (  node  .  val  );      copies  .  put  (  node       clone  );      // Recursively clone neighbors      for     (  Node     neighbor     :     node  .  neighbors  )     {      clone  .  neighbors  .  add  (  cloneGraph  (  neighbor  ));      }      }      // Return the clone      return     copies  .  get  (  node  );      }      // Build graph      public     static     Node     buildGraph  ()     {      Node     node1     =     new     Node  (  0  );      Node     node2     =     new     Node  (  1  );      Node     node3     =     new     Node  (  2  );      Node     node4     =     new     Node  (  3  );      node1  .  neighbors  .  addAll  (  Arrays  .  asList  (  node2       node3  ));      node2  .  neighbors  .  addAll  (  Arrays  .  asList  (  node1       node3  ));      node3  .  neighbors  .  addAll  (  Arrays  .  asList  (  node1    node2       node4  ));      node4  .  neighbors  .  addAll  (  Arrays  .  asList  (  node3  ));      return     node1  ;      }      // Compare two graphs for structural and value equality      public     static     boolean     compareGraphs  (  Node     node1       Node     node2           HashMap   <  Node       Node  >     visited  )     {      if     (  node1     ==     null     ||     node2     ==     null  )      return     node1     ==     node2  ;      if     (  node1  .  val     !=     node2  .  val     ||     node1     ==     node2  )      return     false  ;      visited  .  put  (  node1       node2  );      if     (  node1  .  neighbors  .  size  ()     !=     node2  .  neighbors  .  size  ())      return     false  ;      for     (  int     i     =     0  ;     i      <     node1  .  neighbors  .  size  ();     i  ++  )     {      Node     n1     =     node1  .  neighbors  .  get  (  i  );      Node     n2     =     node2  .  neighbors  .  get  (  i  );      if     (  visited  .  containsKey  (  n1  ))     {      if     (  visited  .  get  (  n1  )     !=     n2  )      return     false  ;      }     else     {      if     (  !  compareGraphs  (  n1       n2       visited  ))      return     false  ;      }      }      return     true  ;      }      // Driver Code      public     static     void     main  (  String  []     args  )     {      Node     original     =     buildGraph  ();      // Clone the graph      Node     cloned     =     cloneGraph  (  original  );      // Compare original and cloned graph      boolean     result     =     compareGraphs  (  original       cloned       new     HashMap   <>  ());      System  .  out  .  println  (  result     ?     'true'     :     'false'  );      }   }   
Python
   # Definition for a Node   class   Node  :   def   __init__  (  self     val  =  0     neighbors  =  None  ):   self  .  val   =   val   self  .  neighbors   =   neighbors   if   neighbors   is   not   None   else   []   # Map to hold original node to its copy   copies   =   {}   # Function to clone the graph    def   cloneGraph  (  node  ):   # If the node is None return None   if   not   node  :   return   None   # If node is not yet cloned clone it   if   node   not   in   copies  :   # Create a clone of the node   clone   =   Node  (  node  .  val  )   copies  [  node  ]   =   clone   # Recursively clone neighbors   for   neighbor   in   node  .  neighbors  :   clone  .  neighbors  .  append  (  cloneGraph  (  neighbor  ))   # Return the clone   return   copies  [  node  ]   def   buildGraph  ():   node1   =   Node  (  0  )   node2   =   Node  (  1  )   node3   =   Node  (  2  )   node4   =   Node  (  3  )   node1  .  neighbors   =   [  node2     node3  ]   node2  .  neighbors   =   [  node1     node3  ]   node3  .  neighbors   =   [  node1     node2     node4  ]   node4  .  neighbors   =   [  node3  ]   return   node1   # Compare two graphs for structural and value equality   def   compareGraphs  (  node1     node2     visited  ):   if   not   node1   or   not   node2  :   return   node1   ==   node2   if   node1  .  val   !=   node2  .  val   or   node1   is   node2  :   return   False   visited  [  node1  ]   =   node2   if   len  (  node1  .  neighbors  )   !=   len  (  node2  .  neighbors  ):   return   False   for   i   in   range  (  len  (  node1  .  neighbors  )):   n1   =   node1  .  neighbors  [  i  ]   n2   =   node2  .  neighbors  [  i  ]   if   n1   in   visited  :   if   visited  [  n1  ]   !=   n2  :   return   False   else  :   if   not   compareGraphs  (  n1     n2     visited  ):   return   False   return   True   # Driver Code   if   __name__   ==   '__main__'  :   original   =   buildGraph  ()   # Clone the graph using DFS   cloned   =   cloneGraph  (  original  )   # Compare original and cloned graph   visited   =   {}   print  (  'true'   if   compareGraphs  (  original     cloned     visited  )   else   'false'  )   
C#
   using     System  ;   using     System.Collections.Generic  ;   public     class     Node     {      public     int     val  ;      public     List   <  Node  >     neighbors  ;      public     Node  ()     {      val     =     0  ;      neighbors     =     new     List   <  Node  >  ();      }      public     Node  (  int     _val  )     {      val     =     _val  ;      neighbors     =     new     List   <  Node  >  ();      }   }   class     GfG     {      // Dictionary to hold original node to its copy      static     Dictionary   <  Node       Node  >     copies     =     new     Dictionary   <  Node       Node  >  ();      // Function to clone the graph using DFS      public     static     Node     CloneGraph  (  Node     node  )     {      // If the node is NULL return NULL      if     (  node     ==     null  )     return     null  ;      // If node is not yet cloned clone it      if     (  !  copies  .  ContainsKey  (  node  ))     {      Node     clone     =     new     Node  (  node  .  val  );      copies  [  node  ]     =     clone  ;      // Recursively clone neighbors      foreach     (  Node     neighbor     in     node  .  neighbors  )     {      clone  .  neighbors  .  Add  (  CloneGraph  (  neighbor  ));      }      }      // Return the clone      return     copies  [  node  ];      }      // Build graph      public     static     Node     BuildGraph  ()     {      Node     node1     =     new     Node  (  0  );      Node     node2     =     new     Node  (  1  );      Node     node3     =     new     Node  (  2  );      Node     node4     =     new     Node  (  3  );      node1  .  neighbors  .  Add  (  node2  );      node1  .  neighbors  .  Add  (  node3  );      node2  .  neighbors  .  Add  (  node1  );      node2  .  neighbors  .  Add  (  node3  );      node3  .  neighbors  .  Add  (  node1  );      node3  .  neighbors  .  Add  (  node2  );      node3  .  neighbors  .  Add  (  node4  );          node4  .  neighbors  .  Add  (  node3  );      return     node1  ;      }      // Compare two graphs for structural and value equality      public     static     bool     CompareGraphs  (  Node     node1       Node     node2           Dictionary   <  Node       Node  >     visited  )     {      if     (  node1     ==     null     ||     node2     ==     null  )      return     node1     ==     node2  ;      if     (  node1  .  val     !=     node2  .  val     ||     node1     ==     node2  )      return     false  ;      visited  [  node1  ]     =     node2  ;      if     (  node1  .  neighbors  .  Count     !=     node2  .  neighbors  .  Count  )      return     false  ;      for     (  int     i     =     0  ;     i      <     node1  .  neighbors  .  Count  ;     i  ++  )     {      Node     n1     =     node1  .  neighbors  [  i  ];      Node     n2     =     node2  .  neighbors  [  i  ];      if     (  visited  .  ContainsKey  (  n1  ))     {      if     (  visited  [  n1  ]     !=     n2  )      return     false  ;      }     else     {      if     (  !  CompareGraphs  (  n1       n2       visited  ))      return     false  ;      }      }      return     true  ;      }      // Driver Code      public     static     void     Main  ()     {      Node     original     =     BuildGraph  ();      // Clone the graph using DFS      Node     cloned     =     CloneGraph  (  original  );      // Compare original and cloned graph      bool     isEqual     =     CompareGraphs  (  original       cloned       new      Dictionary   <  Node       Node  >  ());      Console  .  WriteLine  (  isEqual     ?     'true'     :     'false'  );      }   }   
JavaScript
   // Definition for a Node   class     Node     {      constructor  (  val     =     0  )     {      this  .  val     =     val  ;      this  .  neighbors     =     [];      }   }   // Map to hold original node to its copy   const     copies     =     new     Map  ();   // Function to clone the graph using DFS   function     cloneGraph  (  node  )     {      // If the node is NULL return NULL      if     (  node     ===     null  )     return     null  ;      // If node is not yet cloned clone it      if     (  !  copies  .  has  (  node  ))     {      const     clone     =     new     Node  (  node  .  val  );      copies  .  set  (  node       clone  );      // Recursively clone neighbors      for     (  let     neighbor     of     node  .  neighbors  )     {      clone  .  neighbors  .  push  (  cloneGraph  (  neighbor  ));      }      }      // Return the clone      return     copies  .  get  (  node  );   }   // Build graph   function     buildGraph  ()     {      const     node1     =     new     Node  (  0  );      const     node2     =     new     Node  (  1  );      const     node3     =     new     Node  (  2  );      const     node4     =     new     Node  (  3  );      node1  .  neighbors  .  push  (  node2       node3  );      node2  .  neighbors  .  push  (  node1       node3  );      node3  .  neighbors  .  push  (  node1       node2       node4  );      node4  .  neighbors  .  push  (  node3  );      return     node1  ;   }   // Compare two graphs for structural and value equality   function     compareGraphs  (  node1       node2       visited     =     new     Map  ())     {      if     (  !  node1     ||     !  node2  )      return     node1     ===     node2  ;      if     (  node1  .  val     !==     node2  .  val     ||     node1     ===     node2  )      return     false  ;      visited  .  set  (  node1       node2  );      if     (  node1  .  neighbors  .  length     !==     node2  .  neighbors  .  length  )      return     false  ;      for     (  let     i     =     0  ;     i      <     node1  .  neighbors  .  length  ;     i  ++  )     {      const     n1     =     node1  .  neighbors  [  i  ];      const     n2     =     node2  .  neighbors  [  i  ];      if     (  visited  .  has  (  n1  ))     {      if     (  visited  .  get  (  n1  )     !==     n2  )      return     false  ;      }     else     {      if     (  !  compareGraphs  (  n1       n2       visited  ))      return     false  ;      }      }      return     true  ;   }   // Driver Code   const     original     =     buildGraph  ();   // Clone the graph using DFS   const     cloned     =     cloneGraph  (  original  );   // Compare original and cloned graph   console  .  log  (  compareGraphs  (  original       cloned  )     ?     'true'     :     'false'  );   

Излаз
true