• leetcode133


    Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains a label (int) and a list (List[UndirectedGraphNode]) of its neighbors. There is an edge between the given node and each of the nodes in its neighbors.
    OJ's undirected graph serialization (so you can understand error output):
    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
             /
             \_/
     
    Note: The information about the tree serialization is only meant so that you can understand error output if you get a wrong answer. You don't need to understand the serialization to solve the problem.
     
     
    BFS+Map.
    BFS直接对老nodesBFS,q里都加老nodes。Map里存着label到新node的映射。
    BFS到某个老node的时候,遍历邻居的时候只要两件事情:
    1.如果邻居node还没有,新建node。
    2.在由新nodes组建的图中连上边。因为你知道当前BFS是对哪个点以及当前访问的邻居是谁,所以知道是哪条边。
    最后返回mapping.get(head.label)即可。
     
    实现:
    /**
     * Definition for undirected graph.
     * class UndirectedGraphNode {
     *     int label;
     *     List<UndirectedGraphNode> neighbors;
     *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
     * };
     */
    public class Solution {
        public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
            // map: Integer-Node: label - Created Node
            if (node == null) {
                return null;
            }
            Map<Integer, UndirectedGraphNode> map = new HashMap<>();
            Queue<UndirectedGraphNode> q = new LinkedList<>();
            
            q.offer(node);
            map.put(node.label, new UndirectedGraphNode(node.label));
            while (!q.isEmpty()) {
                UndirectedGraphNode crt = q.poll();
                for (UndirectedGraphNode neighbor : crt.neighbors) {
                    // 1.generate node if needed.
                    if (!map.containsKey(neighbor.label)) {
                        UndirectedGraphNode newNode = new UndirectedGraphNode(neighbor.label);
                        map.put(neighbor.label, newNode);
                        q.offer(neighbor);
                    }
                    // 2.link the edge for the new graph.
                    map.get(crt.label).neighbors.add(map.get(neighbor.label));
                }
            }
            return map.get(node.label);
        }
    }
  • 相关阅读:
    [爬虫] js
    [爬虫] appium-移动端
    如何进行代码的重构
    重写与覆盖的区别
    解决C#中FileSystemWatcher类的Changed事件触发多次的问题
    关于sqlserver 2008 远程导入表数据
    css 选择器
    前端三剑客
    前端的概述
    元类作业
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/9764167.html
Copyright © 2020-2023  润新知