题目:克隆图

来源:互联网 发布:2017苹果mac桌面壁纸 编辑:程序博客网 时间:2024/06/05 20:09

克隆一张无向图,图中的每个节点包含一个label和一个列表neighbors

LintCode Online Judge的无向图序列化:

图节点有唯一的label。

使用#作为一个分隔符,分隔节点的label和每个相邻节点neighbors。比如,序列化图{0,1,2#1,2#2,2}共有三个节点,因此包含两个个分隔符#。


1、第一个节点label为0,存在边从节点0链接到节点1和节点2

2、第二个节点label为1,存在边从节点1连接到节点2

3、第三个节点label为2,存在边从节点2连接到节点2(本身),从而形成自环。

我们能看到如下的图:

    1

      / \

     /   \

    0 --- 2

         / \


         \_/

您在真实的面试中是否遇到过这个题?

Yes





样例
相关题目 Expand   

解题思路
BFS,用quene表示需要遍历的节点,map存储遍历过的节点
参考了
http://www.programcreek.com/2012/12/leetcode-clone-graph-java/
/*** 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) {        // write your code here        if(node == null ) return null;        Queue<UndirectedGraphNode> quene = new LinkedList<>();        HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();        UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);        quene.add(node);        map.put(node, newNode);        while(!quene.isEmpty()){             UndirectedGraphNode cur = quene.poll();             ArrayList<UndirectedGraphNode>  neighbors  = cur.neighbors;             for(UndirectedGraphNode neighbor:neighbors){                 if(!map.containsKey(neighbor)){                      UndirectedGraphNode copy = new UndirectedGraphNode(neighbor.label);                      map.put(neighbor, copy);                      map.get(cur).neighbors.add(copy);                      quene.add(neighbor);                 }else{                      map.get(cur).neighbors.add(map.get(neighbor));                 }             }        }        return newNode;    }} 

0 0
原创粉丝点击