计算机网络——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算法计算从起点到其他的点的最端路径然后输出,同时会输出经过的点。
热门推荐
与其抱怨社会不公,不如理性接受自己的无能
代码评审中如何确保代码的完整性
银屑病皮肤干怎么保湿好
炒蒜苔虽然是一道家常菜,但想要做得好吃,也需要掌握一定的技巧
“大蒜是个宝,一生少不了”,4种大蒜家常做法,学会做给家人吃
奇亚籽小孩也能吃?健康小秘密揭晓
贾玲刘德华跨年同台互动,粉丝福利满满!
贾玲新作《热辣滚烫》:一部关于自我救赎的励志之作
美元贬值对黄金价格的影响机制与投资策略
如何理解黄金价格的起伏变化?这种起伏变化如何影响市场预期?
ETC缴费新姿势:秒过收费站!
桂林市元宵节烟花燃放攻略:安全第一!
靖菡老师教你和孩子一起学唱《苹果香》
《苹果香》:一首歌里的伊犁文化
首个“世界非遗版”春节 广西文旅非一般精彩
高血压没有不舒服,可以不治疗吗?
A股技术分析入门:从K线图到MACD指标
《尚书》中的“公”字:公正精神的源头与传承
生命最美的馈赠,少点语言挖苦打击,多一点支持肯定鼓励
使用肯定语——利用积极思考
使用肯定语——利用积极思考
防盗门使用指南:响声处理、保养技巧与标准尺寸全解析
床塌了?这些原因你绝对想不到!
《使命召唤手游》AN94最强配件攻略:职业选手推荐与实战技巧详解
大数据选股:量比分析、趋势判断与资金监控实战指南
K线图技术分析:理性投资的辅助工具
荔波小七孔打卡秘籍:避开人流拍大片!
荔波小七孔:生态保护典范获权威认可
贵州荔波小七孔4日游,你准备好了吗?
荔波小七孔:地球腰带上的绿宝石