计算机网络——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)

相关推荐
君鼎15 小时前
计算机网络第八章:互联网上的音频视频服务总结
计算机网络
小李独爱秋16 小时前
计算机网络经典问题透视:RTS/CTS是强制使用还是选择使用?
网络协议·计算机网络·网络安全·信息与通信·信号处理
小李独爱秋17 小时前
计算机网络经典问题透视:无线局域网MAC协议中的SIFS和DIFS究竟是什么?
网络协议·计算机网络·macos·网络安全·信息与通信·信号处理
diudiu_3317 小时前
RCE漏洞
计算机网络
ling___xi1 天前
《计算机网络》计网3小时期末速成课各版本教程都可用谢稀仁湖科大版都可用_哔哩哔哩_bilibili(笔记)
网络·笔记·计算机网络
浩浩测试一下1 天前
WAF绕过之编码绕过特性篇
计算机网络·web安全·网络安全·网络攻击模型·安全威胁分析·安全架构
CS创新实验室1 天前
《计算机网络》深入学:路由算法与路径选择
网络·计算机网络·算法
CS创新实验室2 天前
《计算机网络》深入学:IPv4 协议架构与演进
网络·计算机网络·架构·ipv4
一轮弯弯的明月2 天前
TCP传输大致过程、流量控制与拥塞控制
网络·tcp/ip·计算机网络·学习心得
谢怜823 天前
电网计算机网络第六章应用层
网络·计算机网络