leetcode, LC18: clone-graph

1 题目描述

题目描述
本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表
我们无向图用以下的方法序列化:

  • 节点的标签是互不相同的,
  • 我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。
    例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.
    这个无向图一共有3个节点,因此序列被#分隔成三部分
  1. 第一个节点的标签是0,节点0和节点1,节点2之间有边
  2. 第二个节点的标签是1,节点1和节点2之间有边
  3. 第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

2 解题思路

广度优先遍历

3 代码实现

/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */

typedef UndirectedGraphNode UGN;

class Solution {
public:
    UGN *cloneGraph(UGN *node) {
        if(node == NULL)
            return NULL;
        
        map<int, UGN*> m;    /// 用来记录在正在复制的无向图中已有哪些结点
        queue<UGN *> q;    // 用来实现广度优先搜索的队列
        UGN *firstCopyNode = new UGN(node->label);    // 先复制起始结点
        m[firstCopyNode->label] = firstCopyNode;    // 往map中加入起始节点
        q.push(node);    // 往队列中加入起始节点
        while(!q.empty()){    // 当队列不为空时
            // 取出队列中的第一个结点
            UGN *front = q.front();    
            q.pop();
            for(UGN *neighbor : front->neighbors){    // 对于这个结点的每一个邻居
                if(m.find(neighbor->label) == m.end()){    // 如果这个邻居还不在map中
                    UGN *newCopyNode = new UGN(neighbor->label);    // 则复制这个邻居
                    m[neighbor->label] = newCopyNode;    // 并在map中加入该邻居
                    q.push(neighbor);    // 在队列中也加入该邻居
                }
                m[front->label]->neighbors.push_back(m[neighbor->label]);    // 复制这个结点的邻居
            }
        }
        return firstCopyNode;
    }
};

4 运行结果

运行时间:6ms
占用内存:760k

你可能感兴趣的:(leetcode,数据结构,队列,leetcode)