Graph 133. Clone Graph in three ways(bfs, dfs, bfs(recursive))

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

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
         /          \_/

Basically just clone the graph like clone a list in leetcode 138.

there are three ways t solve this (just traverse the graph and put new node into map)

/**
 * Definition for undirected graph.
 * class UndirectedGraphNode {
 *     int label;
 *     List<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
 * };
 */
public class Solution {
    //dfs
    Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        if(node==null) return null;
        //copy graph(deep copy), hashmap
        map.put(node, new UndirectedGraphNode(node.label));
        helper(node);
        return map.get(node);
    }
    void helper(UndirectedGraphNode node){
        for(int i = 0; i< node.neighbors.size(); i++){
            UndirectedGraphNode neighbor = node.neighbors.get(i);
            if(!map.containsKey(neighbor)){// not visited
                UndirectedGraphNode newNode = new UndirectedGraphNode(neighbor.label);
                map.put(neighbor, newNode);//visited
                helper(neighbor);//why put helper here
            }
            map.get(node).neighbors.add(map.get(neighbor)); //set the link of neighbors
        }
    }
}

Solution 2: bfs queue

/**
 * 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) {
        if(node==null) return null;
        //bfs
        LinkedList<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>();
        queue.offer(node);
        Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();

        UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
        map.put(node,newNode);
        while(!queue.isEmpty()){
            UndirectedGraphNode cur = queue.poll();//pop
            for(int i = 0; i<cur.neighbors.size(); i++){
                UndirectedGraphNode neighbor = cur.neighbors.get(i);
                if(!map.containsKey(neighbor)){
                    queue.offer(neighbor);
                    newNode = new UndirectedGraphNode(neighbor.label);
                    map.put(neighbor, newNode);
                    map.get(cur).neighbors.add(newNode);
                }
                //if contains the key
                else map.get(cur).neighbors.add(map.get(neighbor));
            }
        }
        return map.get(node);
    }
}

Solution 3: dfs with all node connected.

/**
 * 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) {
        if(node == null) return null;
        //dfs, if not visited, visited it and set it to visited, stack
        LinkedList<UndirectedGraphNode> stack = new LinkedList<>();//add first
        stack.push(node);
        Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
        UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
        map.put(node, newNode);
        while(!stack.isEmpty()){
            UndirectedGraphNode cur = stack.pop();//pop
            for(int i = 0; i<cur.neighbors.size(); i++){
                UndirectedGraphNode neighbor = cur.neighbors.get(i);//neighbor of current
                if(!map.containsKey(neighbor)){//put neighbor into hashmap (visited)
                    newNode = new UndirectedGraphNode(neighbor.label);//copy neighbors
                    map.put(neighbor, newNode);
                    stack.push(neighbor);
                }
                //set the link of neighbors
                map.get(cur).neighbors.add(map.get(neighbor));

            }

        }
        return map.get(node);
    }
}
// relationship in hashmap
// key,             value
// cur,             map.get(cur)
// cur.neighbors,   newNode/ map.get(eighbor)

What if nodes are not connnected partly: just write a loop to chekc all the node(call dfs for each node) in the graph

https://www.geeksforgeeks.org/depth-first-search-or-dfs-for-a-graph/

How do you represent the graph(one way from leetcode, another from geekforgeek)

Lastly: think about the time complexity of them

原文地址:https://www.cnblogs.com/stiles/p/leetcode133.html

时间: 2024-12-11 08:17:43

Graph 133. Clone Graph in three ways(bfs, dfs, bfs(recursive))的相关文章

133. Clone Graph 138. Copy List with Random Pointer 拷贝图和链表

133. 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 lab

133. Clone Graph (3 solutions)——无向无环图复制

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 an

133. 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 n

133. Clone Graph Leetcode Python

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 neigh

leetcode 133. Clone Graph ----- java

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 neigh

Java for LeetCode 133 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 neighb

133. Clone Graph (Graph, Map; DFS)

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 neigh

[leedcode 133] 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 neigh

133 Clone Graph 克隆图

克隆一张无向图,图中的每个节点包含一个 label 和一个列表 neighbors列表 .OJ的无向图序列化:节点被唯一标记.我们用 # 作为每个节点的分隔符,用 , 作为节点标签和节点的每个邻居的分隔符.比如,序列化图 {0,1,2#1,2#2,2}.共有三个节点, 因此包含两个个分隔符  #.     第一个节点label为 0,存在边从节点 0 链接到节点 1 和节点 2.    第二个节点label为 1,存在边从节点 1 连接到节点 2.    第三个节点label为 2,存在边从节点