lintcode137-克隆图

题目描述:

本题重点在于避免重复生成节点,避免在构造节点的相邻节点时插入重复节点。

为避免超时问题,在遍历图的过程中,就生成新节点,并构造节点的相邻节点。

代码:

UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) {
        // write your code here
        if(node == NULL)
            return NULL;
        
        unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> match;
        queue<UndirectedGraphNode*> que;
        map<UndirectedGraphNode*, bool> isvisited;
        que.push(node);
        isvisited[node] = true;
        match[node] = new UndirectedGraphNode(node->label);
        
        while(!que.empty()){
            UndirectedGraphNode* tmp = que.front();
            que.pop();
            
            
            for(int i=0; i<tmp->neighbors.size(); ++i){
                if(isvisited[tmp->neighbors[i]] == false){    //如果这个相邻节点还没有生成新的副本
                    UndirectedGraphNode* temp = new UndirectedGraphNode(tmp->neighbors[i]->label);
                    isvisited[tmp->neighbors[i]] = true;
                    match[tmp->neighbors[i]] = temp;
                    que.push(tmp->neighbors[i]);   //压入到队列中的都是已经生成副本的节点
                    match[tmp]->neighbors.push_back(temp);//在弹出时,就不用考虑当前节点,只关注节点的相邻节点是否已经生成副本
                }
                else{      //已经生成新副本,直接把这个节点的副本压入到当前节点tmp的副本的vector中
                    match[tmp]->neighbors.push_back(match[tmp->neighbors[i]]);
                }
            }
            
        }
        
        return match[node];
        
    }
参考博客:https://blog.csdn.net/zhaohengchuan/article/details/76196724

猜你喜欢

转载自blog.csdn.net/ddou_pan/article/details/80325931
今日推荐