zoukankan      html  css  js  c++  java
  • LeetCode 算法题之CloneGraph

    一个无向图,深度克隆一份无向图出来;

    这个题目本身并不是很难,主要是要深度克隆,所以采用hash表来进行存储旧的节点和新的节点的地址,采用BFS遍历,算法如下:

     1 /**
     2  * Definition for undirected graph.
     3  * struct UndirectedGraphNode {
     4  *     int label;
     5  *     vector<UndirectedGraphNode *> neighbors;
     6  *     UndirectedGraphNode(int x) : label(x) {};
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
    12         if(node==NULL)
    13         return NULL;
    14         unordered_set<int> visted;//保存访问过的节点label
    15         unordered_map<int,UndirectedGraphNode*> pointMap;//保存节点的新地址
    16         queue<UndirectedGraphNode*> qu;
    17         qu.push(node);
    18         UndirectedGraphNode *newNode=new UndirectedGraphNode(node->label);
    19         UndirectedGraphNode *startNode=newNode;
    20         pointMap.insert(make_pair(node->label,newNode));
    21         while(!qu.empty())
    22         {
    23             UndirectedGraphNode *oldNode=qu.front();
    24             newNode=pointMap.find(oldNode->label)->second;
    25             qu.pop();
    26             for(vector<UndirectedGraphNode*>::iterator iter=oldNode->neighbors.begin();iter!=oldNode->neighbors.end();iter++)
    27             {
    28                 
    29                 if(visted.find((*iter)->label)==visted.end()&&(pointMap.find((*iter)->label)==pointMap.end()))
    30                 {
    31                    UndirectedGraphNode *q=new UndirectedGraphNode((*iter)->label);
    32                    pointMap.insert(make_pair((*iter)->label,q));
    33                     qu.push(*iter);
    34                     newNode->neighbors.push_back(q);
    35                 }
    36                 else
    37                 {
    38                     newNode->neighbors.push_back(pointMap.find((*iter)->label)->second);
    39                 }
    40             }
    41             visted.insert(oldNode->label);
    42 
    43         }
    44         return startNode;
    45         
    46         
    47     }
    48 };

    最开始的时候遇到一个问题:Output exceed;看不懂什么意思,而且本机上返回的结果看起来似乎也没有问题。于是我在visual studio中逐步调试,最后发现问题在于29行,原来我只有一个判断if(visited.find((*iter)->label)!=visited.end()),这样子即使导致一些节点被多次推入队列,于是new了太多的节点,所以出现了output exceed,如三角形无向图1,2,3,节点3 在访问节点1的时候会推入队列,访问节点2的时候又会推入队列,所以复制了两遍节点3。

  • 相关阅读:
    JAVA 打开文件乱码
    单引号和双引号的区别
    global和$GLOBALS[]的区别
    php统计数组元素个数
    PHP5.3x不再支持ereg和eregi
    discuz论坛diy标签
    网页特效过渡功能
    discuz缓存机制
    php数组中删除元素
    speedphp是个不错的框架
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3538457.html
Copyright © 2011-2022 走看看