单源最短路径dijkstral算法

手写迪杰斯特拉-Dijkstra

转自:https://www.bilibili.com/video/BV1jE411W7tT?share_source=copy_web

 

 

输入文件:(test.txt)

7
0 5 2 9999 9999 9999 9999
5 0 9999 1 6 9999 9999
2 9999 0 6 9999 8 9999
9999 1 6 0 1 2 9999
9999 6 9999 1 0 9999 7
9999 9999 8 2 9999 0 3
9999 9999 9999 9999 7 3 0

采用floyed算法计算计算出来的结果:

 

 

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 constexpr int INF = 0x3F;
 7 
 8 vector<int> dijkstral(const vector<vector<int>> &graph, int start) {
 9     int n = graph.size();
10     vector<int> dis(n, INF); // 初始化起点到各节点最短距离为无穷大
11     vector<bool> visited(n, false); // 初始化所有节点未被选过
12     dis[start] = 0; // 初始起点到起点距离为0
13     for (int i = 0; i < n - 1; i++) {
14         int minNode = -1;
15         // 选定一个节点:
16         // 1)未被选过;
17         // 2)距离最短;
18         for (int j = 0; j < n; j++) {
19             if (!visited[j] && ((minNode == -1) || (dis[j] < dis[minNode]))) {
20                 minNode = j;
21             }
22         }
23         // 对于已选择的节点作为中转站,刷新经过中转站到各节点的最短路径
24         for (int j = 0; j < n; j++) {
25             dis[j] = std::min(dis[j], dis[minNode] + graph[minNode][j]);
26         }
27         visited[minNode] = true;
28     }
29     return dis;
30 }
31 
32 void buildGraph(int n, vector<vector<int>> &graph) {
33     for (int i = 0; i < n; i++) {
34         for (int j = 0; j < n; j++) {
35             std::cin >> graph[i][j];
36         }
37     }
38 }
39 void printGraph(const vector<vector<int>> &graph) {
40     for (const auto &vec : graph) {
41         for (const auto &val : vec) {
42             std::cout << val << " ";
43         }
44         std::cout << endl;
45     }
46 
47     std::cout << endl;
48 }
49 
50 int main()
51 {
52     FILE *fpIn;
53     fpIn = freopen("D:\\test.txt", "r", stdin);
54     if (fpIn == nullptr) {
55         std::cout << "freopen fail!" << endl;
56     }
57     int n = 0;
58     std::cin >> n;
59     vector<vector<int>> graph(n, vector<int>(n));
60     // 构建无向带权图
61     buildGraph(n, graph);
62     // 打印无向图
63     printGraph(graph);
64     // 遍历打印n个节点作为中转站时到各节点的最短距离数组:
65     for (int i = 0; i < n; i++) {
66         int start = i;
67         std::cout << "start : " << start << endl;
68         std::cout << "dis[" << i << "]:";
69         vector<int> dis = dijkstral(graph, start);
70         for (const auto &val : dis) {
71             std::cout << val << " ";
72         }
73         std::cout << endl;
74     }
75     fclose(fpIn);
76     system("pause");
77     return 0;
78 }
复制代码

验证结果:

 

posted @   跳动的休止符  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示