• Clone Graph


    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.


    OJ's undirected graph serialization:

    Nodes are labeled uniquely.

    We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

    As an example, consider the serialized graph {0,1,2#1,2#2,2}.

    The graph has a total of three nodes, and therefore contains three parts as separated by #.

    1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
    2. Second node is labeled as 1. Connect node 1 to node 2.
    3. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

    Visually, the graph looks like the following:

           1
          / 
         /   
        0 --- 2
             / 
             \_/
    这道题题目有点长,略微有点烦。这道题思路还是比较简单,直接用DFS或者BFS可以A
    这里我用的是DFS
    ps:剩下leetcode上面的hard类型了
     1 import java.util.ArrayList;
     2 
     3 import java.util.Hashtable;
     4 import java.util.List;
     5 
     6 public class Solution {
     7     public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
     8         if(null == node)
     9             return node;
    10         boolean isFirst = true;
    11         Hashtable<UndirectedGraphNode, Integer> visited = new Hashtable<UndirectedGraphNode, Integer>();
    12         Hashtable<UndirectedGraphNode, UndirectedGraphNode> map = new Hashtable<UndirectedGraphNode, UndirectedGraphNode>();
    13         
    14         DFS(node, visited, map, isFirst);
    15         
    16         visited = new Hashtable<UndirectedGraphNode, Integer>();
    17         isFirst = false;
    18         DFS(node, visited, map, isFirst);
    19         
    20         return map.get(node);
    21         
    22     }
    23     
    24     private void DFS(UndirectedGraphNode node, Hashtable<UndirectedGraphNode, Integer> visited, 
    25             Hashtable<UndirectedGraphNode, UndirectedGraphNode> map, boolean isFirst){
    26         if(visited.get(node) == null){            
    27             if(isFirst){
    28                 UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
    29                 map.put(node, newNode);                                                    //key为旧的引用,value为新的引用
    30             }
    31             
    32             //深度遍历
    33             List<UndirectedGraphNode> neighborsList = node.neighbors;
    34             visited.put(node, 1);                                                    //标记为已访问
    35             for(UndirectedGraphNode nodeInList : neighborsList){
    36                 if(isFirst){                                                        //第一次遍历
    37                     DFS(nodeInList, visited, map, isFirst);
    38                 }else{                                                                //第二次遍历
    39                     if(map.get(node).neighbors == null)
    40                         map.get(node).neighbors = new ArrayList<UndirectedGraphNode>();
    41                     map.get(node).neighbors.add(map.get(nodeInList));
    42                     DFS(nodeInList, visited, map, isFirst);
    43                 }
    44             }
    45         }
    46         else
    47             return;
    48     }
    49 }
  • 相关阅读:
    【WPF】【基础】布局系统
    【设计】【托管扩展性框架】 MEF vs 2010 samples
    【wpf】【控件】内容控件
    【Wpf】【debug】Exception has been thrown by the target of an invocation.
    【设计模式】概述
    期待与悲催中的2012
    金额转为大写人民币
    使用vs2005的GridView控件,菜鸟问题。
    Microsoft Visual Studio 2005中使用水晶报表
    将金额小写转化成汉字大写(javascript)
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4245066.html
Copyright © 2020-2023  润新知