• 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。

  • 相关阅读:
    洛谷P3796 【模板】AC自动机(加强版)(AC自动机)
    洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
    洛谷P1501 [国家集训队]Tree II(LCT,Splay)
    LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
    [BZOJ3172][TJOI2013]单词 AC自动机
    [BZOJ1968][AHOI2005]COMMON约数研究 数学
    [BZOJ1053][SDOI2005]反素数ant 数学
    [BZOJ1045][HAOI2008]糖果传递 数学
    [BZOJ2733][HNOI2012]永无乡 线段树合并
    [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3538457.html
Copyright © 2020-2023  润新知