zoukankan      html  css  js  c++  java
  • 133. Clone Graph

        /*
         * 133. Clone Graph
         * 12.19 by Mingyang
         * 第一种方法就是我们用的那种BFS的方法,queue进行广度遍历
         * 不要忘了新建neighbor的点后要注意把关系也copy过来
         * 第二种方法就是DFS的方法,也就是stack来做深度遍历,换汤不换药
         * 无论怎么换,记住,用map比较好,可以记住两个node之间的对应关系
    * 最容易错误的地方在于queue.add(neighbor);必须在if判断句里面,不然会形成loop,只有第一次出现才可以
    */ public UndirectedGraphNode cloneGraph(UndirectedGraphNode root) { if (root == null) return null; Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>(); queue.add(root); map.put(root, new UndirectedGraphNode(root.label)); while (!queue.isEmpty()) { UndirectedGraphNode node = queue.poll(); // handle the neighbors for (UndirectedGraphNode neighbor : node.neighbors) { if (!map.containsKey(neighbor)) { map.put(neighbor, new UndirectedGraphNode(neighbor.label));
    // 这就是一个映射的影子,对于每一个元素,在地图中注册下你的影子
    //这里的queue必须放在if里面加
    queue.add(neighbor); } // copy the neighbor map.get(node).neighbors.add(map.get(neighbor));
    // 当注册好影子以后,我们需要把原图中的关系也copy过来 } } return map.get(root); } // 用非递归的DFS来做,也就是用Stack public UndirectedGraphNode cloneGraph2(UndirectedGraphNode root) { if (root == null) return null; HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); LinkedList<UndirectedGraphNode> stack = new LinkedList<UndirectedGraphNode>(); UndirectedGraphNode head = new UndirectedGraphNode(root.label); map.put(root, head); stack.push(root); while (!stack.isEmpty()) { UndirectedGraphNode node = stack.pop(); for (UndirectedGraphNode neighbor : node.neighbors) { if (!map.containsKey(neighbor)) { map.put(neighbor, new UndirectedGraphNode(neighbor.label)); stack.push(neighbor); } map.get(node).neighbors.add(map.get(neighbor)); } } return head; } //用递归的DFS public UndirectedGraphNode cloneGraph3(UndirectedGraphNode node) { if(node == null) return null; HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>(); UndirectedGraphNode head = new UndirectedGraphNode(node.label); map.put(node, new UndirectedGraphNode(node.label)); dfs(map, node);//DFS return head; } public void dfs(HashMap<UndirectedGraphNode, UndirectedGraphNode> map, UndirectedGraphNode node){ if(node == null) return; for(UndirectedGraphNode neighbor: node.neighbors){ if(!map.containsKey(neighbor)){ map.put(neighbor, new UndirectedGraphNode(neighbor.label)); dfs(map, neighbor);//DFS } map.get(node).neighbors.add(map.get(neighbor)); } }
  • 相关阅读:
    静态资源的映射
    controller进行数据保存
    接收的参数为日期类型时
    分页助手(pagehelper)
    逆向工程(generator)----->由表帮我们来生成dao、bean、xml
    动态sql语句(即sql语句的拼接)
    添加对象时如何把生成的id返回
    $和#的区别
    关联查询
    字段与属性不匹配的解决方法
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5518588.html
Copyright © 2011-2022 走看看