zoukankan      html  css  js  c++  java
  • [LeetCode] 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 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存储创建的新的结点,其中key是结点的label值,value是结点的指针值。
    /**
     * Definition for undirected graph.
     * struct UndirectedGraphNode {
     *     int label;
     *     vector<UndirectedGraphNode *> neighbors;
     *     UndirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if(node==NULL)
                return NULL;
            UndirectedGraphNode *pnode = node;
            UndirectedGraphNode *head = new UndirectedGraphNode(node->label);
            UndirectedGraphNode *p = head;
            map<int,UndirectedGraphNode *> labelAndNode;
            labelAndNode[head->label] = head;
            pNodeNeighbors(pnode,p,labelAndNode);
            return head;
        }
    private:
        void pNodeNeighbors(UndirectedGraphNode *&pnode,UndirectedGraphNode *&p,map<int,UndirectedGraphNode *> &labelAndNode)
        {
            int num = pnode->neighbors.size();
            UndirectedGraphNode *pnew ;
            for(int i = 0;i<num;i++)
            {
                if(labelAndNode.count(pnode->neighbors[i]->label)==0)
                {
                   pnew = new UndirectedGraphNode(pnode->neighbors[i]->label);
                   labelAndNode[pnode->neighbors[i]->label] = pnew;
                   p->neighbors.push_back(pnew);
                   pNodeNeighbors(pnode->neighbors[i],p->neighbors[i],labelAndNode);
                }
                else
                {
                  pnew =  labelAndNode[pnode->neighbors[i]->label];
                  p->neighbors.push_back(pnew);
                }
            
            }
        
        
        }
    };
  • 相关阅读:
    斯巴鲁汽车 技术文档下载方法
    博客园 Mac Windows Linux 客户端 源码 electron 开发
    博客园 Mac客户端 1.0 源码
    博客园 Mac客户端 2.0-Beta
    Python数据分析的库
    排版助手Gidot
    离线下载pip包进行安装
    Anaconda+用conda创建python虚拟环境
    ? Install Telegram on Ubuntu via PPA
    使用BeautifulSoup删除html中的script、注释
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3853502.html
Copyright © 2011-2022 走看看