leetcode, LC18: clone-graph

tech2024-01-30  71

1 题目描述

题目描述 本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表 我们无向图用以下的方法序列化:

节点的标签是互不相同的,我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。 例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}. 这个无向图一共有3个节点,因此序列被#分隔成三部分 第一个节点的标签是0,节点0和节点1,节点2之间有边第二个节点的标签是1,节点1和节点2之间有边第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

2 解题思路

广度优先遍历

3 代码实现

/** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector<UndirectedGraphNode *> neighbors; * UndirectedGraphNode(int x) : label(x) {}; * }; */ typedef UndirectedGraphNode UGN; class Solution { public: UGN *cloneGraph(UGN *node) { if(node == NULL) return NULL; map<int, UGN*> m; /// 用来记录在正在复制的无向图中已有哪些结点 queue<UGN *> q; // 用来实现广度优先搜索的队列 UGN *firstCopyNode = new UGN(node->label); // 先复制起始结点 m[firstCopyNode->label] = firstCopyNode; // 往map中加入起始节点 q.push(node); // 往队列中加入起始节点 while(!q.empty()){ // 当队列不为空时 // 取出队列中的第一个结点 UGN *front = q.front(); q.pop(); for(UGN *neighbor : front->neighbors){ // 对于这个结点的每一个邻居 if(m.find(neighbor->label) == m.end()){ // 如果这个邻居还不在map中 UGN *newCopyNode = new UGN(neighbor->label); // 则复制这个邻居 m[neighbor->label] = newCopyNode; // 并在map中加入该邻居 q.push(neighbor); // 在队列中也加入该邻居 } m[front->label]->neighbors.push_back(m[neighbor->label]); // 复制这个结点的邻居 } } return firstCopyNode; } };

4 运行结果

运行时间:6ms 占用内存:760k

最新回复(0)