leetcode_c++:图:Clone Graph(133)

来源:互联网 发布:网络角色扮演游戏排行 编辑:程序博客网 时间:2024/05/17 01:11

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

算法

DFS


#include<iostream>#include<vector>#include<algorithm>#include<unordered_map>using namespace std;// 无向图struct UndirectedGraphNode{    int label;    vector<UndirectedGraphNode* > neighbors;    UndirectedGraphNode(int x):label(x) {};};typedef unordered_map<int, UndirectedGraphNode*> immap;class Solution {private:    immap gmap;    UndirectedGraphNode* dfs(UndirectedGraphNode* node){        UndirectedGraphNode* newnode;        if(gmap.find(node->label)==gmap.end()){            newnode=new UndirectedGraphNode(node->label);            gmap.insert(immap::value_type(node->label,newnode));            for(auto &i:node->neighbors)                newnode->neighbors.push_back(dfs(i));        }else{            newnode=gmap[node->label];        }        return newnode;    }public:    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if(!node)            return NULL;        gmap.clear();        UndirectedGraphNode* ret=dfs(node);        return ret;    }};int main(){    Solution s;    UndirectedGraphNode* a=new UndirectedGraphNode(0),*b;    b=s.cloneGraph(a);    return 0;}

class Solution {public:    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if (node == NULL) return NULL;        //create a map, key is source node, value is clone node.        map<UndirectedGraphNode*, UndirectedGraphNode*> cloneMap;        //using queue for breadth first search        queue<UndirectedGraphNode*> q;        q.push(node);        //clone the root        UndirectedGraphNode* cloneNode = new UndirectedGraphNode(node->label);        cloneMap[node] = cloneNode;        //breadth first search        while(!q.empty()){            UndirectedGraphNode* n = q.front();            q.pop();            //for each neighbors            for(int i=0; i<n->neighbors.size(); i++){                UndirectedGraphNode* neighbor= n->neighbors[i];                //not existed in cloneMap                if (cloneMap.find(neighbor)==cloneMap.end()){                    //clone a node                    UndirectedGraphNode* newNode = new UndirectedGraphNode(neighbor->label);                    cloneMap[n]->neighbors.push_back(newNode);                    cloneMap[neighbor] = newNode;                    //put the neighbors into the queue                    q.push(neighbor);                }else{                    cloneMap[n]->neighbors.push_back(cloneMap[neighbor]);                }            }        }        return cloneNode;    }};
0 0