计算机网络——Dijkstra路由算法
创作时间:
作者:
@小白创作中心
计算机网络——Dijkstra路由算法
引用
CSDN
1.
https://blog.csdn.net/lijj0304/article/details/138436778
Dijkstra算法是计算机网络中常用的路由算法之一,用于计算图中两个节点之间的最短路径。本文将介绍如何基于Dijkstra算法实现一个路由软件,包括实验目的、内容、过程以及关键代码。
实验目的
实现基于 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算法计算从起点到其他的点的最端路径然后输出,同时会输出经过的点。
热门推荐
如何缴纳租赁房屋税款?纳税过程中有哪些注意事项?
牙线对口腔真的有益处吗?看完你就知道了!
王夫之:用思想征服时代的名人
C语言判断素数的三种方法:试除法、埃氏筛法和费马小定理
2024年牙齿破裂紧急处理指南:挽救与预防全攻略
四旋翼飞行器控制、路径规划和轨迹优化的Matlab实现
天津港智慧港口建设:全球首个传统集装箱码头全流程自动化升级改造项目全面运营
不断丰富港口业务和功能——京津冀“海上门户”天津港蹲点见闻
“排斥”的同义词及造句示例
十宗罪的第一部和第四部:法律视角下的深度解析
李斯:千古一相,死于小人之手
夫妻双方共同贷款买房的优势分析
如何选一张适合自己的床垫?4 招选对床垫
健身前后应该怎么拉伸才有效?
如何通过APP界面设计提升用户体验
光伏电站运维安全培训课件
朝内大街81号谜案:一段被遗忘的历史往事
宁波慈溪:新型绿色出行 奏响共同富裕主旋律
探索非劳动收入的多种来源与投资策略
肺纤维条索灶原因及治疗
【ZIF-8碳化材料】基于金属有机框架的二维CNPs超结构用于电磁波吸收
ZIF-8纳米颗粒的制备及应用研究
联合国粮农组织:食品安全问答
看到61岁李连杰现状,我才明白他为何被人唾弃,梁家辉说对了
驾驶证照片制作:步骤详解与要点聚焦
对甲状腺不好的蔬菜有哪些
房子怎么付钱才能确保资金安全?如何选择合适的支付方式?
18650锂电池INR与ICR技术特点详解
选床四部曲!从四个步骤、八个细节搞定好大床,内行人都这样买!
肺炎和白肺的症状有哪些表现