码迷,mamicode.com
首页 > 其他好文 > 详细

133 Clone Graph

时间:2017-07-23 21:04:57      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:rate   span   for   cond   add   不能   size   list   rmi   

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


OJs 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 #.

First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
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
         /          \_/

克隆问题常常用hashMap, 关键在于如何从一个点设置遍历, 此处用list, 不断遍历, 不断list. get(start++) ,再通过neighbour来获取新的node.

/**
 * 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) {
        // write your code here
        if (node == null) {
            return node;
        }
        
        HashMap<UndirectedGraphNode, UndirectedGraphNode> map = 
          new HashMap<UndirectedGraphNode, UndirectedGraphNode> ();
        ArrayList<UndirectedGraphNode> nodes = new ArrayList<UndirectedGraphNode>();
        
        //copy nodes
        nodes.add(node);
        map.put(node, new UndirectedGraphNode(node.label));
        int start = 0; 
        while (start < nodes.size()) {
            UndirectedGraphNode head = nodes.get(start++);
            for (UndirectedGraphNode n : head.neighbors) {
                if (!map.containsKey(n)) {
                    map.put(n, new  UndirectedGraphNode(n.label));
                    // 对nodes进行了add因此不能用foreach
                    nodes.add(n);
                }
            }
        }
        
        //copy neighbors
        for (UndirectedGraphNode i : nodes) {
            UndirectedGraphNode newNode = map.get(i);
            for (UndirectedGraphNode j : i.neighbors) {
                newNode.neighbors.add(map.get(j));
            }
        }
        return map.get(node);
}

}

  

133 Clone Graph

标签:rate   span   for   cond   add   不能   size   list   rmi   

原文地址:http://www.cnblogs.com/apanda009/p/7225763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!