【leetcode】clone-graph
生活随笔
收集整理的這篇文章主要介紹了
【leetcode】clone-graph
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面的話:
看了看自己的博客,從一月底開始就沒怎么更新過,我也確實將近5個月沒怎么寫代碼了。今天突然覺得有些心慌,感覺手都已經生疏了。果然,隨便找了道題就卡住了。隱約感覺要用map但又不太記得用法了,知道可以用DFS或BFS卻又理不清思路。費了兩個小時,結果寫了一個shit一樣的代碼才通過。唉好憂傷啊。
?
?
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?#.
?
Visually, the graph looks like the following:
1/ \/ \0 --- 2/ \\_/?
我的解法:
反應了好久,才發現題目的難點是防止結點的重復建立。我的方法沒有用map,很繁瑣。
#include<iostream> #include<vector> #include<algorithm> #include<stdlib.h> using namespace std;struct UndirectedGraphNode {int label;vector<UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {};}; class Solution { public:UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {//獲取所有獨立的結點vector<UndirectedGraphNode *> UniqueNodes;getUniqueNodes(node, UniqueNodes);return findNode(node, UniqueNodes);}//查找指定結點并返回UndirectedGraphNode * findNode(UndirectedGraphNode * node, vector<UndirectedGraphNode *> UniqueNodes){if(NULL == node)return NULL;for(int i = 0; i < UniqueNodes.size(); i++){if(node->label == UniqueNodes[i]->label){return UniqueNodes[i];}}return NULL;}//獲取圖中所有的結點和連接信息void getUniqueNodes(UndirectedGraphNode *node, vector<UndirectedGraphNode *>& UniqueNodes){//結點空或已存在時直接返回if(NULL == node || NULL != findNode(node, UniqueNodes))return;//存儲新出現的結點UndirectedGraphNode * newNode = new UndirectedGraphNode(node->label);UniqueNodes.push_back(newNode);for(int i = 0; i < node->neighbors.size(); i++){getUniqueNodes(node->neighbors[i], UniqueNodes);newNode->neighbors.push_back(findNode(node->neighbors[i], UniqueNodes));}} };int main() {Solution s;UndirectedGraphNode * node0 = new UndirectedGraphNode(0);UndirectedGraphNode * node1 = new UndirectedGraphNode(1);UndirectedGraphNode * node2 = new UndirectedGraphNode(2);node0->neighbors.push_back(node1);node0->neighbors.push_back(node2);node1->neighbors.push_back(node2);node2->neighbors.push_back(node2);UndirectedGraphNode * newNode = s.cloneGraph(node0);return 0; }?
網上大神解法
/*** Definition for undirected graph.* struct UndirectedGraphNode {* int label;* vector<UndirectedGraphNode *> neighbors;* UndirectedGraphNode(int x) : label(x) {};* };*/ class Solution { private:unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> hash; public://BFSUndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if(!node) return NULL;queue<UndirectedGraphNode*> Qu;Qu.push(node);hash[node] = new UndirectedGraphNode(node->label);while(!Qu.empty()){UndirectedGraphNode * tmp = Qu.front();Qu.pop();for(UndirectedGraphNode * neighbor : tmp->neighbors){if(hash.find(neighbor) == hash.end()){hash[neighbor] = new UndirectedGraphNode(neighbor->label);Qu.push(neighbor);}hash[tmp]->neighbors.push_back(hash[neighbor]);}}return hash[node];}//DFSUndirectedGraphNode *cloneGraph1(UndirectedGraphNode *node) {if(!node) return NULL;if(hash.find(node) == hash.end()){hash[node] = new UndirectedGraphNode(node->label);for(UndirectedGraphNode* neighbor : node->neighbors){hash[node]->neighbors.push_back(cloneGraph1(neighbor));}}return hash[node];} };?
總結
以上是生活随笔為你收集整理的【leetcode】clone-graph的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二十六天 iptables的nat功能
- 下一篇: 转 使用putty从linux主机上面往