LeetCode133. Clone Graph

来源:互联网 发布:手机网络锁原理 编辑:程序博客网 时间:2024/06/17 01:26

题目:

https://leetcode.com/problems/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 #.

First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
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         / \         \_/

思路:

题意:克隆一个图。

BFS遍历图,一边遍历,一边完成克隆。用map记录原来图的节点和克隆图的节点情况,防止克隆过的节点再被new一次。每copy一个原节点,就把原节点与克隆节点放入map中,原节点与克隆节点对应。如果后面的遍历遇到在map中的原节点,表明这个原节点已经被copy过了,不用新new一个节点来再次copy。

代码:

/** * 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* cur=NULL;        UndirectedGraphNode* start=NULL;        UndirectedGraphNode* connect=NULL;        queue<UndirectedGraphNode*> q;        q.push(node);        unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> m;        start=new UndirectedGraphNode (node->label);        m[node]=start;        while(!q.empty()){            cur=q.front();            q.pop();            int len=cur->neighbors.size();            for(int i=0;i<len;i++){                connect=cur->neighbors[i];                if(m.find(connect)==m.end()){                    UndirectedGraphNode* nodeCopy=new UndirectedGraphNode(connect->label);                    m[connect]=nodeCopy;                    q.push(connect);                }                m[cur]->neighbors.push_back(m[connect]);//与原节点对应的克隆节点添加相邻节点            }        }        return start;    }};
0 0