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

发布于:2024-05-09 ⋅ 阅读:(31) ⋅ 点赞:(0)

实验目的

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

实验内容

网络拓扑如图所示

实验过程

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

关键代码

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

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算法来查找最短路径,这里用到了优先队列的思想,同时还额外构建了两个相关,一个用于实时更新最短距离,一个用于存储经过的点

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)


网站公告

今日签到

点亮在社区的每一天
去签到