`

图克隆(C++实现)

 
阅读更多
// Type your C++ code and click the "Run Code" button!
// Your code output will be shown on the left.
// Click on the "Show input" button to enter input data to be read (from stdin).

#include <iostream>
using namespace std;

typedef struct GNode {
    int val;
    vector<GNode *> nbs;
} Node;

typedef unordered_map<Node *, Node *> CloneMap;
typedef unordered_map<Node *, bool> VisitedMap;

// clone graph
Node * clone_graph(Node * graph) {
    if(!graph) return NULL;
    
    CloneMap map;
    queue<Node *> q;
    q.push(graph);
    
    Node *nc = new Node;
    nc->val = graph->val;
    map[graph] = nc;
    
    while(!q.empty()) {
        Node *&front = q.front(); 
        Node *fc = map[front];
        vector<Node *> nbs = front->nbs;
        vector<Node *>::const_iterator it = nbs.begin();
        
        while(it != nbs.end()) {
            Node *ic;
            if(!map[*it]) {
                ic = new Node;
                ic->val = (*it)->val;
                map[*it] = ic;
                q.push(*it);
            } else {
                ic = map[*it];
            }
            fc->nbs.push_back(ic);
            it ++;
        }        
        q.pop();
    }
    return nc;
}


// print graph
void print_graph(Node *graph) {
    if(!graph) return;
    
    VisitedMap map;
    queue<Node *> q;
    q.push(graph);
    
    while(!q.empty()) {
        Node *&front = q.front();
        
        if(!map[front]){
            cout<<front->val<<" ";
            map[front] = true;
        }
        
        vector<Node *> nbs = front->nbs;
        vector<Node *>::const_iterator cit = nbs.begin();
        while(cit != nbs.end()) {
            if(!map[*cit]) {
                cout<<(*cit)->val<<" ";
                map[*cit] = true;
                q.push(*cit);
            }
            cit ++;
        }
        q.pop();
    }
    cout<<endl;
}

int main() {
    Node *n1 = new Node;
    n1->val = 1;
    Node *n2 = new Node;
    n2->val = 2;
    Node *n3 = new Node;
    n3->val = 3;
    Node *n4 = new Node;
    n4->val = 4;
    Node *n5 = new Node;
    n5->val = 5;
    
    n1->nbs.push_back(n2);
    n2->nbs.push_back(n1);
    n1->nbs.push_back(n3);
    n3->nbs.push_back(n1);
    n2->nbs.push_back(n3);
    n3->nbs.push_back(n2);
    n3->nbs.push_back(n4);
    n4->nbs.push_back(n3);
    n4->nbs.push_back(n5);
    n5->nbs.push_back(n4);
    
    // test clone function
    Node *nc = clone_graph(n2);
    
    print_graph(n1);
    print_graph(n2);
    print_graph(nc);
    
    return 0;
}

欢迎关注微信公众号——计算机视觉:

分享到:
评论

相关推荐

    C++实现的BOSN bson-cpp的编译

    BSON-cpp是C++实现的一个库,允许开发者在C++项目中方便地处理BSON数据。本篇文章将详细介绍如何在C++环境下编译和使用BOSN提供的bson-cpp库。 首先,我们需要确保我们的开发环境中已经安装了必要的依赖。对于BSON-...

    GoF+23种设计模式解析附C++实现源码(2nd+Edition).pdf

    **C++实现**: Prototype模式的核心是定义一个抽象的Prototype类,该类声明了克隆自身的接口。具体的产品类继承自Prototype,并实现自己的克隆方法。 ### 二、结构型模式 #### 2.1 Bridge模式 **定义**: Bridge...

    Minecraft地形有关算法的c++实现

    在本文中,我们将深入探讨如何使用C++实现Minecraft中的地形生成算法,以及与之相关的游戏功能。Minecraft是一款极具创新性的沙盒游戏,其核心之一就是多样化的地形生成,为玩家提供无尽的探索空间。为了实现这样的...

    UE5中角色克隆的C++与蓝图实现方法

    通过使用C++或蓝图,你可以轻松地克隆角色,并复制其所有的属性和组件。希望本文的信息能帮助你在UE5项目中成功克隆角色。 在实际应用中,你可以参考Epic Games提供的官方文档和其他相关资源,例如Epic Developer ...

    C++图片处理源码,类似于mspaint的源码开发工具

    在本资源中,我们拥有的是一套C++编写的图片处理源码,它与微软的“画图”(mspaint)程序类似,是用于图像编辑和处理的开发工具。这个项目对于想要深入理解C++图形界面编程、图像处理以及软件开发流程的开发者来说,...

    通过C++实现原型模式(Prototype Pattern).rar

    压缩包文件代码是一个使用C++实现原型模式的简单例子。 注意事项 1、在C++中,我们通常使用智能指针(如std::unique_ptr或std::shared_ptr)来管理动态分配的对象,以避免内存泄漏和悬挂指针。 2、由于我们使用了...

    c++实现的免疫算法

    在这个“c++实现的免疫算法”项目中,开发者成功地运用C++编写了一个能够正常运行的免疫算法程序。 免疫算法的基本思想来源于生物免疫系统对病原体的识别和防御机制。主要包括克隆选择理论、抗体多样性生成、免疫...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

    C++设计模式(GoF 23种设计解析附C++实现源码)

    - **C++实现**:通过克隆已有实例来创建新对象。 #### 结构型模式 **2.1 Bridge模式** - **定义**:将抽象部分与它的实现部分分离,使它们都可以独立变化。 - **应用场景**:如果一个类存在两个独立变化的维度,...

    利用C++打开和保存图像文件

    这些格式的读写操作在C++中可以通过各种库来实现,如Windows SDK中的GDI+,或者第三方库如OpenCV。 首先,我们需要包含必要的头文件来使用MFC的功能。对于图像文件操作,主要涉及`#include &lt;afxwin.h&gt;`,这个头文件...

    C++ 23种设计模式1

    《C++ 23种设计模式1》是关于软件工程中设计模式的深入解析,主要聚焦于C++语言的实现。设计模式是经过时间和实践验证的解决方案,它们针对常见的编程问题提供了一套标准的模板,使得开发者能够更高效地编写可复用、...

    原型模式测试浅复制和深复制(C++)

    这个模式在C++中可以通过实现拷贝构造函数和赋值运算符来实现。下面我们将深入探讨原型模式、浅复制和深复制的概念及其在C++中的应用。 ### 原型模式 原型模式的基本思想是通过对象的克隆(clone)方法创建新对象。...

    免疫算法代码-c++实现-codeblock工程.zip

    在这个项目中,我们将深入探讨免疫算法的原理及其在C++中的实现,并通过codeblocks工程来展示一个可以直接运行的解决方案。 免疫算法的灵感来源于生物免疫系统对病原体的识别和消除过程。主要包含克隆选择、抗体...

    clone 深度克隆对象

    在Java中,实现深度克隆通常有两种方式:一是通过实现Cloneable接口并重写Object类的clone()方法;二是使用序列化和反序列化技术。前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,...

    GoF 23种设计模式解析附C++实现源码.pdf

    - **C++实现**: 通过重载赋值运算符或使用克隆方法来实现对象的复制。 #### 四、结构型模式 **2.1 Bridge模式** - **定义**: 将抽象部分与其实现部分分离,使它们都可以独立地变化。 - **目的**: 解耦接口和实现...

    RBF神经网络C++源码

    通过学习和理解RBF神经网络的原理和C++实现,你可以掌握一种强大的机器学习工具,为解决实际问题提供新的思路。同时,深入研究GitHub上的开源代码,不仅有助于提升编程技能,还能了解到最新的技术动态和最佳实践。

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它为解决特定问题提供了一套标准的解决方案。《设计模式精解——GoF 23种设计模式解析及C++实现源码...

    GoF 23种设计模式解析附C++实现源码C++.pdf

    ### GoF 23种设计模式解析及C++实现概览 #### 一、引言 设计模式是在软件工程领域中被广泛接受的一种实践方法,它帮助开发者解决常见问题并提高代码质量。由Erich Gamma等四人所著的《设计模式:可复用面向对象...

    UE5中角色克隆的深度指南:从概念到实现

    本文将详细介绍UE5中角色克隆的概念、实现步骤和最佳实践,以及如何通过代码和蓝图来控制克隆角色的行为。 角色克隆是UE5中一个强大的功能,它可以为游戏开发带来许多可能性。通过掌握角色克隆的基本概念和实现方法...

Global site tag (gtag.js) - Google Analytics