[LeetCode] 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 #.

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


分析:

思路本身没有什么tricky的地方。用bfs或者dfs来对原图进行traversal,同时复制原图即可。实践发现,dfs比bfs更简便。这里给出两个版本的代码。


代码:

bfs:

class Solution {
public:
	UndirectedGraphNode *bfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {
		queue<UndirectedGraphNode *> bfsQueue;
		bfsQueue.push(node);
		while (!bfsQueue.empty()) {
			UndirectedGraphNode * curr = bfsQueue.front();
			UndirectedGraphNode * copyCurr = visited.find(curr->label)
				== visited.end() ? new UndirectedGraphNode(curr->label) :
									visited[curr->label];
			visited[curr->label] = copyCurr;
			bfsQueue.pop();
			for (int i = 0; i < curr->neighbors.size(); i ++) {
				if (visited.find(curr->neighbors[i]->label) == visited.end()) { // first time visit
					bfsQueue.push(curr->neighbors[i]);
					UndirectedGraphNode *temp = new UndirectedGraphNode(curr->neighbors[i]->label);
					visited[curr->neighbors[i]->label] = temp;
					copyCurr->neighbors.push_back(temp);
				}
				else { // not first time visit
					UndirectedGraphNode * temp = visited[curr->neighbors[i]->label];
					copyCurr->neighbors.push_back(temp);
				}
			}
		}
		return visited[node->label];
	}

	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
		if (!node) return node;
		map<int, UndirectedGraphNode *> visited;
		return bfs(node, visited);
	}
};

dfs:

class Solution {
public:
	UndirectedGraphNode *dfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {
		UndirectedGraphNode * copyNode = new UndirectedGraphNode (node->label);
		visited[node->label] = copyNode;
		for (int i = 0; i < node->neighbors.size(); i ++) {
			if (!visited[node->neighbors[i]->label])
				copyNode->neighbors.push_back(dfs(node->neighbors[i], visited));
			else
				copyNode->neighbors.push_back(visited[node->neighbors[i]->label]);
		}
		return copyNode;
	}

	UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
		if (!node) return node;
		map<int, UndirectedGraphNode *> visited;
		return dfs(node, visited);
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值