|

楼主 |
发表于 2023-10-7 22:50:15
|
显示全部楼层
以下是使用静态数组模拟的Dijkstra算法模板示例:
- #include <iostream>
- #include <cstring>
- using namespace std;
- const int N = 1005;
- const int INF = 0x3f3f3f3f; // 表示无穷大
- int g[N][N]; // 存储图的邻接矩阵
- int dist[N]; // 存储源点到各个顶点的最短距离
- bool vis[N]; // 记录顶点是否已被访问
- void Dijkstra(int n, int s) {
- memset(dist, INF, sizeof(dist)); // 初始化距离为无穷大
- memset(vis, false, sizeof(vis)); // 初始化所有顶点未被访问
- dist[s] = 0; // 源点到自身的距离为0
- for (int i = 0; i < n; i++) {
- int u = -1, minDist = INF; // u用于记录当前未访问顶点中距离最小的顶点
- // 寻找距离最小的顶点
- for (int j = 0; j < n; j++) {
- if (!vis[j] && dist[j] < minDist) {
- u = j;
- minDist = dist[j];
- }
- }
- if (u == -1) break; // 所有顶点都访问过,退出循环
- vis[u] = true; // 标记顶点u为已访问
- // 更新源点到其他未访问顶点的距离
- for (int v = 0; v < n; v++) {
- if (!vis[v] && g[u][v] != INF) {
- dist[v] = min(dist[v], dist[u] + g[u][v]);
- }
- }
- }
- }
- int main() {
- int n, m;
- cin >> n >> m; // 输入点数n和边数m
- // 初始化邻接矩阵,将除对角线外的元素初始化为无穷大
- memset(g, INF, sizeof(g));
- for (int i = 0; i < n; i++) g[i][i] = 0;
- int a, b, c;
- for (int i = 0; i < m; i++) {
- cin >> a >> b >> c; // 输入边的起点、终点和权值
- g[a][b] = min(g[a][b], c); // 若存在多条边,则取最小的权值
- }
- int s;
- cin >> s; // 输入源点s
- Dijkstra(n, s);
- // 输出源点到各个顶点的最短距离
- for (int i = 0; i < n; i++) {
- cout << "源点" << s << "到达顶点" << i << "的最短距离为:" << dist[i] << endl;
- }
- return 0;
- }
复制代码
此模板使用静态数组来模拟Dijkstra算法,其中g数组存储图的邻接矩阵,dist数组存储源点到各个顶点的最短距离,vis数组记录顶点是否已被访问。算法的核心是通过遍历未访问的顶点,选择距离最小的顶点进行松弛操作,更新最短距离。
希望以上回答对你有帮助!如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!   |
|