133. Clone Graph

来源:互联网 发布:查看是否安装mysql 编辑:程序博客网 时间:2024/06/06 07:49

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,现在竟然写不出来了,怎么了???

DFS不是有套路吗?

dfs() {if() ..... return;for(.....) {dfs()}}


向下面这样的DFS是不对的,

(1)DFS最开始是先要一直调用一直调用直到return,下面就不是(dfs一般出现在第一句)

(2)既然是递归,为什么会for循环里面和循环外面都有

UndirectedGraphNode root = new UndirectedGraphNode(node.label);

要么就在for循环里面,要么就把for循环里的这个语句通过递归转移到循环外面


public class Solution {Map<Integer, UndirectedGraphNode> map = new HashMap<Integer, UndirectedGraphNode>();    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {    if(node == null)return null;    if(map.containsKey(node.label))return map.get(node.label);        UndirectedGraphNode root = new UndirectedGraphNode(node.label);    map.put(node.label, new UndirectedGraphNode(node.label));        for(UndirectedGraphNode n : node.neighbors) {    if(!map.containsKey(n.label)) {    UndirectedGraphNode newNode = new UndirectedGraphNode(n.label);    map.put(n.label, newNode);    map.get(node.label).neighbors.add(map.get(n.label));    cloneGraph(n);    } else    map.get(node.label).neighbors.add(map.get(n.label));            }        return root;    }}


正确的是:

import java.util.HashMap;import java.util.Map;public class Solution {Map<Integer, UndirectedGraphNode> map = new HashMap<Integer, UndirectedGraphNode>();    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {    if(node == null)return null;    if(map.containsKey(node.label))return map.get(node.label);        UndirectedGraphNode root = new UndirectedGraphNode(node.label);    map.put(node.label, root);        for(int i=0; i<node.neighbors.size(); i++) {    UndirectedGraphNode childRoot = cloneGraph(node.neighbors.get(i));    root.neighbors.add(childRoot);    }        return root;    }}


先要看能不能用DFS,能用的话怎么用?

比如这里:先把neighbor给clone掉,再把返回值添加到ArrayList里面就好了,思路应该是比较清晰的,看了还是缺少总结啊

1 0