題目描述
本題要求複製一個無向圖,圖中每個節點都包含一個標籤和它的鄰居列表
我們無向圖用以下的方法序列化:
節點的標籤是互不相同的,
我們使用“#”作爲節點之間的分隔符,使用“,”作爲節點標籤和節點的節點鄰居的分隔符。
例如:現在有一個序列化的無向圖{0,1,2#1,2#2,2}.
這個無向圖一共有3個節點,因此序列被#分隔成三部分
第一個節點的標籤是0,節點0和節點1,節點2之間有邊
第二個節點的標籤是1,節點1和節點2之間有邊
第三個節點的標籤是2,節點2和節點2(它自己)之間有邊,形成了自環
我們看到了這個題之後,有什麼想法呢,這個無向圖,和鏈表,和二叉樹有什麼區別呢,其實沒有本質的區別,無非是另外一種結構罷了。那麼我們如何複製呢,本題的解法就涉及到兩個知識點
- 無向圖如何能遍歷完全?深度優先遍歷DFS,把圖的節點先複製下來。
- 用map保存舊節點和新節點的映射關係。
一些細節呢,比如DFS通過遞歸實現,map用的是unordered_map<>實現,unordered_map中的元素,first是key,second是value。
下面就是代碼,整體來說沒有多少難度
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
void dfs(UndirectedGraphNode* node){
if(node==nullptr) return;
if(mp.count(node)) return;
auto cpyNode = new UndirectedGraphNode(node->label);
mp[node] = cpyNode;
for (auto subnode:node->neighbors){
dfs(subnode);
}
}
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
auto oldNode = node;
dfs(node);
for (auto item:mp){
auto first = item.first;
for(int i=0;i < first->neighbors.size();i++){
item.second->neighbors.push_back(mp[first->neighbors[i]]);
}
}
return mp[oldNode];
}
};