Clone Graph

来源:互联网 发布:交大软件学院 编辑:程序博客网 时间:2024/06/07 04:56

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

How we serialize an undirected graph:

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:

/** * Definition for undirected graph. * class UndirectedGraphNode { *     int label; *     ArrayList<UndirectedGraphNode> neighbors; *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */public class Solution {    /**     * @param node: A undirected graph node     * @return: A undirected graph node     */    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {        if (node == null) {            return null;        }        //使用BFS获取所有的点        ArrayList<UndirectedGraphNode> nodes = bfsHelper(node);        //copy 点        HashMap<UndirectedGraphNode, UndirectedGraphNode> mapping = new HashMap<>();        for (UndirectedGraphNode n : nodes) {            mapping.put(n, new UndirectedGraphNode(n.label));        }        //copy 边        for (UndirectedGraphNode n : nodes) {            //取出原节点对应的新节点            UndirectedGraphNode newNode = mapping.get(n);            for (UndirectedGraphNode neighbor : n.neighbors) {                //取出原节点的邻接点对应的新节点的邻接点                UndirectedGraphNode newNeighbor = mapping.get(neighbor);                //将其赋值给新节点的邻接点                newNode.neighbors.add(newNeighbor);            }        }        return mapping.get(node);    }    //图的BFS使用Set来保证每个节点遍历一次和边无关    private ArrayList<UndirectedGraphNode> bfsHelper(UndirectedGraphNode node) {        ArrayList<UndirectedGraphNode> nodes = new ArrayList<>();        Queue<UndirectedGraphNode> queue = new LinkedList<>();        Set<Integer> hash = new HashSet<>();        queue.offer(node);        hash.add(node.label);        while (!queue.isEmpty()) {            UndirectedGraphNode temp = queue.poll();            nodes.add(temp);            for (UndirectedGraphNode neighbor : temp.neighbors) {                if (hash.contains(neighbor.label)) {                    continue;                }                queue.offer(neighbor);                hash.add(neighbor.label);            }        }        return nodes;    }}
0 0
原创粉丝点击