设为首页 加入收藏

TOP

Clone Graph -- leetcode
2015-11-21 01:00:47 来源: 作者: 【 】 浏览:2
Tags:Clone Graph leetcode

?

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

    ?

    给出一个无向连通图,要求复制

    ?

    基本思路:

    对图的遍历,采取广度优先或者深度优先。

    遍历时,需要记住已访问的结点。避免重复访问。这功能可以和下面的map重用。

    另外需要一个map, 映射,当前节点,和其对应的复制节点。

    访问每一个节点时,需要复制其邻接边。对题目来讲,就是复制其 neighbours数组。

    当边所引用的节点不存在时,需要创建此结点。

    ?

    以下深度优先实现方式。在leetcode上实际执行时间为 72ms。

    ?

    /**
     * Definition for undirected graph.
     * struct UndirectedGraphNode {
     *     int label;
     *     vector
        
          neighbors;
     *     UndirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if (!node) return node;
            stack
         
           s; unordered_map
          
            m; s.push(node); auto root = new UndirectedGraphNode(node->label); m[node] = root; while (!s.empty()) { node = s.top(); s.pop(); auto node_copy = m[node]; for (auto neighbor: node->neighbors) { auto ? = m[neighbor]; if (!copy) { s.push(neighbor); copy = new UndirectedGraphNode(neighbor->label); } node_copy->neighbors.push_back(copy); } } return root; } };
          
         
        

    广度优先实际方式。在leetcode上执行时间为76ms。

    ?

    即将上面算法的stack换成了queue。

    ?

    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if (!node) return node;
            queue
        
          q;
            unordered_map
         
           m; q.push(node); auto root_copy = new UndirectedGraphNode(node->label); m[node] = root_copy; while (!q.empty()) { node = q.front(); q.pop(); auto node_copy = m[node]; for (auto neighbor: node->neighbors) { auto ? = m[neighbor]; if (!copy) { q.push(neighbor); copy = new UndirectedGraphNode(neighbor->label); } node_copy->neighbors.push_back(copy); } } return root_copy; } };
         
        


    ?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA558 - Wormholes(BellmanFord.. 下一篇ByteArrayOutputStream的OutOfMem..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: