Clone Graph leetcode

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

/**

* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/

 

图的遍历有两种方法,一种是广度优先搜索,一种是深度优先搜索。

最naive的方法就是遍历一边,然后得到结果。

但是有一个需要考虑的点是,如果出现了重复怎么办

          B

        /     \

     /           \

A------------D

解决办法是,可以建一个 map 来存储已经遍历过的节点, map的pair的内容是 <oldnode, new node>

然后思路是,

1. BSF 遍历图

2. 如果节点的邻接节点没有在已经遍历过的map中出现,那么新建一个节点,更新map。

如果这个节点已经在遍历的map中出现过,那么就需要更新邻接关系即可。

    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        // BSF
        if(node == NULL) return NULL;
        queue<UndirectedGraphNode*> mq;
        unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> mp;
        UndirectedGraphNode * newnode;
        mq.push(node);
        newnode = new UndirectedGraphNode(node->label);
        mp[node] = newnode;
        
        while(!mq.empty())
        {
            UndirectedGraphNode * tmp = mq.front();
            mq.pop();            
            for(int i=0; i<tmp->neighbors.size(); i++)
            {
                UndirectedGraphNode*  neighbor = tmp->neighbors[i];                
                if(mp.find(neighbor)== mp.end())
                {
                    newnode = new UndirectedGraphNode(neighbor->label); //新建一个节点
                    mp[neighbor]= newnode;  //把这个节点加到map中去
                    mp[tmp]->neighbors.push_back(newnode);   //更新拷贝后的节点的邻接关系。
                    mq.push(neighbor); // DSF 的入queue
                }
                else
                {
                    mp[tmp]->neighbors.push_back(mp[neighbor]); //因为已经遍历过了,那就只需要更新邻接关系即可
                    
                }
            }
            
        }
        
        return mp[node];
        
    }

 

这个题目的思路还可以用在这道题目上

Copy List with Random Pointer

 A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        
        RandomListNode * result;
        unordered_map<RandomListNode*, RandomListNode*> mp;
        RandomListNode* node = head;
        if(head == NULL) return head;
        
        while(node!= NULL)
        {
            RandomListNode* tmpnode = new RandomListNode(node->label);
            mp[node] = tmpnode; //
            node= node->next;// go to next node
        }
        node = head;
        while(node!=NULL)
        {
            RandomListNode *randnode = node->random;
            RandomListNode *next = node->next;
            mp[node]->random = mp[randnode];
            mp[node]->next = mp[next];
            node= node->next;
        }
        
        return mp[head];
    }

对于所有有不确定的重复的情况,都可以使用类似的map来解决。

 

posted @ 2014-02-10 03:35  来自海边的一片云  阅读(163)  评论(0编辑  收藏  举报