计算机网络——Dijkstra路由算法

实验目的

实现基于 Dijkstra 算法的路由软件

实验内容

网络拓扑如图所示

实验过程

先编写开辟应该图的空间,然后给点映射数字,构建图。程序获取用户输入的学号,构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点,然后运用dijkstra算法,计算最短路径然后输出,同时还会输出经过的点

关键代码

建图部分,先申请出这个图占用的空间,然后构建一个点到数字的映射,接着编写建图的函数划分学号中的数字来建图

cpp 复制代码
std::vector<std::vector<int>> adj = {
//   u, v, w, x, y, z 
    {0, 0, 0, 0, 0, 0},// u
    {0, 0, 0, 0, 0, 0},// v
    {0, 0, 0, 0, 0, 0},// w
    {0, 0, 0, 0, 0, 0},// x
    {0, 0, 0, 0, 0, 0},// y
    {0, 0, 0, 0, 0, 0} // z
};

std::unordered_map<char, int> toint = {
    {'u', 0}, 
    {'v', 1}, 
    {'w', 2}, 
    {'x', 3}, 
    {'y', 4}, 
    {'z', 5}
};
std::unordered_map<int, char> tochar = {
    {0, 'u'}, 
    {1, 'v'}, 
    {2, 'w'}, 
    {3, 'x'}, 
    {4, 'y'}, 
    {5, 'z'}
};

void addlink(char num, char a, char b) {
    int add;
    if (num == '0') {
        add = 10;
    }
    else {
        add = (int)(num - '0');
    }
    adj[toint[a]][toint[b]] = add;
    adj[toint[b]][toint[a]] = add;
}

算法部分,编写dijkstra算法来查找最短路径,这里用到了优先队列的思想,同时还额外构建了两个相关,一个用于实时更新最短距离,一个用于存储经过的点

cpp 复制代码
void dijkstra(int src, std::vector<int>& dist, std::vector<int>& prev) {
    int n = adj.size();
    dist.assign(n, INF);
    prev.assign(n, -1);

    dist[src] = 0;
    std::priority_queue<
        std::pair<int, int>, 
        std::vector<std::pair<int, int>>, 
        std::greater<std::pair<int, int>>
    > pq;
    pq.push({0, src});

    while (!pq.empty()) {
        int v = pq.top().second;
        pq.pop();

        for (int u = 0; u < n; u++) {
            if (adj[v][u] != 0) {
                int new_dist = dist[v] + adj[v][u];
                if (new_dist < dist[u]) {
                    dist[u] = new_dist;
                    prev[u] = v;
                    pq.push({new_dist, u});
                }
            }
        }
    }
}

void printpath(int v, const std::vector<int>& prev, int end) {
    if (v < 0) return;
    printpath(prev[v], prev, end);
    if (end != v) {
        std::cout << tochar[v] << "-";
    }
    else {
        std::cout << tochar[v];
    }
}

void printdijikstra(int start) {
    std::vector<int> dist, prev;
    dijkstra(start, dist, prev);

    for (int i = 1; i < adj.size(); i++) {
        printpath(i, prev, i);
        std::cout << ": " << dist[i] << std::endl;
    }
}

运行示例

程序在输入了学号之后,自动更具拓扑结构建图,输出邻接矩阵。然后用户输入最短路径的起点,然后程序调用dijkstra算法计算从起点到其他的点的最端路径然后输出,同时会输出经过的点

完整代码

BJTU_CS_Learning/computernetwork/dijkstra.cpp at main · JJLi0427/BJTU_CS_Learning (github.com)

相关推荐
流浪0014 天前
计算机网络篇23:数据链路层——以太网帧格式与 MAC 地址,MTU 牵住 UDP 和 TCP,ARP 拿 IP 换 MAC
计算机网络·mac·数据链路层·arp·mtu·局域网通信
老秦包你会4 天前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
say_fall5 天前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
流浪0015 天前
计算机网络篇21:网络层——网段划分与子网掩码,从分类地址到 CIDR 与可用主机数
计算机网络·子网划分·nat·子网掩码·cidr·网络层协议
咔_5 天前
有IPv6地址,为什么外面还是连不进来?让同一台服务分别卡在四个位置
linux·计算机网络
流浪0015 天前
计算机网络篇22:网络层——公网的三级地址划分与逐跳转发,从私网出口替换到 IP 分片组装
tcp/ip·计算机网络·路由器·公网搭建·报文分篇
Java成神之路-6 天前
TCP Socket 与 UDP Socket
tcp/ip·计算机网络·udp
流浪0017 天前
计算机网络篇20:网络层——IP 协议的定位与 IPv4 报头字段,从 20 字节首部到 TTL 防环
tcp/ip·计算机网络·ttl·网络层协议·ip报头
流浪0018 天前
计算机网络篇17:传输层——TCP 超时重传、三次握手与四次挥手,TIME_WAIT 为什么要等 2MSL
网络协议·tcp/ip·计算机网络·三次握手·四次挥手·超时重传
流浪0019 天前
计算机网络篇16:传输层——TCP 报头属性字段:16 位窗口大小撑起流量控制,六个标志位标识报文类型
网络协议·tcp/ip·计算机网络·urg紧急指针·tcp报头