146_leetcode_Clone Graph

来源:互联网 发布:如何小型扫描二维数据 编辑:程序博客网 时间:2024/04/29 01:15

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

1:注意特殊情况, 图的value值唯一;2:图由邻接链表组成;3:对图进行两次BFS(广度优先遍历)第一次分别复制相应的节点,第二次获得相应节点的邻接矩阵

4:使用unorder_map结构来实现判断当前节点是否已经访问过。

    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node)    {        if(node == NULL)        {            return NULL;        }                deque<UndirectedGraphNode *> myDeque;        unordered_map<int, UndirectedGraphNode *> myMap;                myDeque.push_back(node);                while(!myDeque.empty())        {            UndirectedGraphNode *tmpNode = myDeque.front();            myDeque.pop_front();                        if(myMap.find(tmpNode->label) == myMap.end())            {                UndirectedGraphNode *curNode = new UndirectedGraphNode(tmpNode->label);                myMap[tmpNode->label] = curNode;                                for(int i = 0; i < (int)tmpNode->neighbors.size(); i++)                {                    myDeque.push_back(tmpNode->neighbors[i]);                }            }        }                myDeque.push_back(node);        while(!myDeque.empty())        {            UndirectedGraphNode *tmpNode = myDeque.front();            myDeque.pop_front();                        UndirectedGraphNode* curCloneNode = myMap[tmpNode->label];                        if(!tmpNode->neighbors.empty() && curCloneNode->neighbors.empty())            {                for(int i = 0; i < (int)tmpNode->neighbors.size(); i++)                {                    myDeque.push_back(tmpNode->neighbors[i]);                    curCloneNode->neighbors.push_back(myMap[tmpNode->neighbors[i]->label]);                }            }        }                return myMap[node->label];    }


0 0
原创粉丝点击