IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++模拟距离向量路由选择算法(DV算法) -> 正文阅读

[C++知识库]C++模拟距离向量路由选择算法(DV算法)

#include<iostream>
#include<vector>
#include<string>
#include<windows.h>
#define Inifinity 65535

class NetNode {
public:
    friend class DV;
private:
    std::vector<std::vector<int>>direction_vector;
    struct info {
        std::string node_name;
        unsigned int node_id;
    }node_info;

    void InitNetNode(const int& node_number, const std::pair<std::string, int>& info) {
        node_info.node_name = info.first;
        node_info.node_id = info.second;
        direction_vector.resize(node_number);
        for (int i = 0; i < node_number; ++i) {
            direction_vector[i].resize(node_number);
            if (i == node_info.node_id) {
                std::cout << "Please input value:";
                for (int j = 0; j < node_number; ++j) {
                    int value;
                    std::cin >> value;
                    direction_vector[i][j] = value;
                }
            }
            else {
                for (int j = 0; j < node_number; ++j) {
                    direction_vector[i][j] = Inifinity;
                }
            }
        }
        //show_value();
    }

    std::vector<int> return_self_value(const int& id) const {
        std::vector<int> self_value;
        for (auto& value : direction_vector[id])
            self_value.push_back(value);
        return self_value;
    }
  
    void BellmanFord_Function()
    {
        std::cout << "NetNode-" + node_info.node_name << " now is using bellmanford function to update!" << std::endl;
        for (int i = 0; i < direction_vector.size(); ++i)
        {
            if (i == node_info.node_id)
                continue;
            direction_vector[node_info.node_id][i]
                = get_min_value(i);
        }
    }

    void show_value() const {
        for (int i = 0; i < direction_vector.size(); ++i)
        {
            for (int j = 0; j < direction_vector.size(); ++j)
            {
                std::cout << direction_vector[i][j] << " ";
            }
            std::cout << std::endl;
        }
    }

    int get_min_value(const int& destination)
    {
        int res = Inifinity;
        for (int i = 0; i < direction_vector.size(); ++i)
        {
            if (i == node_info.node_id)
                continue;
            if ((direction_vector[node_info.node_id][i] + direction_vector[i][destination]) < res)
            {
                res = direction_vector[node_info.node_id][i] + direction_vector[i][destination];
            }
        }
        return res;
    }
};

class DV {
public:
    explicit DV(const int& netnode_number)
        :m_netnode_number(netnode_number)
    {
        InitNet();
    }
    void DV_algorithm() {
        while (true)
        {
            bool flag = false;
            for (int i = 0; i < m_netnode_number; ++i)
            {
                if (receive_message(i)) flag = true;
                else flag = false;
                Sleep(1000);
            }
            if (flag)
            {
                for (int i = 0; i < m_netnode_number; ++i)
                {
                    m_netnode[i].BellmanFord_Function();
                    m_netnode[i].show_value();
                    Sleep(1000);
                }
            }
            else break;
        }
    }

    void show_net_value() const {
        for (int i = 0; i < m_netnode_number; ++i) {
            m_netnode[i].show_value();
            std::cout << std::endl;
        }
    }
    static int index;
private:
    std::vector<NetNode>m_netnode;
    int m_netnode_number;
private:
    //init
    void InitNet()
    {
        for (int i = 0; i < m_netnode_number; ++i)
        {
            NetNode netnode;
            std::cout << "Please give a name for your netnode:";
            std::string name;
            std::cin >> name;
            netnode.InitNetNode(m_netnode_number, std::make_pair(name, DV::index));
            m_netnode.push_back(netnode);
            DV::index++;
        }
    }
    //update a netnode
    bool receive_message(const int& id) {
        bool flag = false;
        std::cout << "NetNode-" + m_netnode[id].node_info.node_name << " now is receiving messages!" << std::endl;
        for (int i = 0; i < m_netnode_number; ++i)
        {
            if (i == id)
                continue;
            int column = 0;
            for (auto value : m_netnode[i].return_self_value(i)) {
                if (m_netnode[id].direction_vector[i][column] == value)
                {
                    column++;
                    continue;
                }
                m_netnode[id].direction_vector[i][column] = value;
                column++;
                if (!flag) flag = true;
            }
        }
        m_netnode[id].show_value();
        return flag;
    }
};

int DV::index = 0;

void Test()
{
    DV dv(3);
    dv.DV_algorithm();
    dv.show_net_value();
}

int main()
{
    Test();
    return 0;
}

测试用例:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:37:21  更:2021-09-11 18:37:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:56:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码