zoukankan      html  css  js  c++  java
  • LeetCode OJ-- Clone Graph **@

    https://oj.leetcode.com/problems/clone-graph/

    图的拷贝,就是给一个图,再弄出一个一模一样的来。

    /**
     * Definition for undirected graph.
     * struct UndirectedGraphNode {
     *     int label;
     *     vector<UndirectedGraphNode *> neighbors;
     *     UndirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if(node == NULL)
                return node;
            
            vector<UndirectedGraphNode *> allNode;
            unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> oldToNew;
            
            // 对于每一个node,都建立一个新node,把这关系存到map里面。之后对每个旧node,添加相应新node里的neighbour
            
            allNode.push_back(node);
            UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label);
            oldToNew.insert(make_pair(node,newNode));
                    
            int index = 0;
            UndirectedGraphNode *current;
            UndirectedGraphNode *neighNode;
            vector<UndirectedGraphNode *> neighbours;
            // build new nodes
            while(index < allNode.size())
            {
                current = allNode[index];
                index++;
                neighbours = current->neighbors;
                
                for(int i = 0; i < neighbours.size(); i++)
                {
                    neighNode = neighbours[i];
                    // 之前没有添加过它相应的
                    if(oldToNew.find(neighNode) == oldToNew.end())
                    {
                        UndirectedGraphNode *newNode = new UndirectedGraphNode(neighNode->label);
                        oldToNew.insert(make_pair(neighNode,newNode));
                        
                        allNode.push_back(neighNode);
                    }
                }
            }
            // build neighbours
            unordered_map<UndirectedGraphNode *, UndirectedGraphNode *>::iterator itr;
            for(itr = oldToNew.begin(); itr!=oldToNew.end(); itr++)
            {
                current = itr->first;
                neighbours = current->neighbors;
                for(int i = 0; i < neighbours.size(); i++)
                {
                    itr->second->neighbors.push_back(oldToNew[neighbours[i]]);
                }
            }
            return oldToNew[node];
        }
    };
  • 相关阅读:
    状态模式作业
    建造者模式作业
    关于 IIS 上的 Speech 设置
    装饰模式作业
    《软件架构与设计模式》关于 抽象工厂模式 的一个小例子
    谈一谈为什么我要创建个人博客
    C#网站发布在IIS10上,Access数据库读取为空白的解决方案
    广义表 Head Tail
    c# asp.net4.0尚未在web服务器上注册
    装饰者模式(例子)
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3917015.html
Copyright © 2011-2022 走看看