首页 > 编程语言 >C/C++ Dijkstra(迪杰斯特拉)算法详解及源码

C/C++ Dijkstra(迪杰斯特拉)算法详解及源码

时间:2024-07-01 19:59:17浏览次数:3  
标签:distance vector int graph 迪杰 算法 Dijkstra 源码 顶点

Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家Edsger Dijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。

算法思想:

  1. 初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶点距离设置为无穷大)
  2. 创建一个集合S,用于保存已经找到最短路径的顶点
  3. 重复以下步骤,直到集合S包含所有顶点:
    • 从未包含在集合S中的顶点中,选择距离起点最短的顶点v
    • 将顶点v添加到集合S中
    • 对于v的每个邻接顶点u,如果通过v可以缩短起点到顶点u的距离,则更新距离数组中u的距离值为起点到v的距离加上v到u的边的权重

优点:

  1. Dijkstra算法能够找到起点到各个顶点的最短路径,确保解的正确性。
  2. 算法的时间复杂度较低,对于稠密图和稀疏图都能够高效地求解最短路径问题。

缺点:

  1. 算法要求图中边的权重必须为非负数,否则结果可能不正确。
  2. 当图的规模较大时,Dijkstra算法的时间复杂度较高,不适合处理规模较大的问题。

以下是使用C++语言实现Dijkstra算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

vector<int> dijkstra(vector<vector<pair<int, int>>> graph, int start) {
    int n = graph.size();
    vector<int> distance(n, numeric_limits<int>::max());
    vector<bool> visited(n, false);
    distance[start] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        visited[u] = true;

        for (auto &v : graph[u]) {
            if (!visited[v.first] && distance[u] + v.second < distance[v.first]) {
                distance[v.first] = distance[u] + v.second;
                pq.push({distance[v.first], v.first});
            }
        }
    }

    return distance;
}

int main() {
    int n, m, start;
    cin >> n >> m >> start;

    vector<vector<pair<int, int>>> graph(n);

    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    vector<int> distance = dijkstra(graph, start);

    for (int i = 0; i < n; ++i) {
        cout << "Distance from " << start << " to " << i << ": " << distance[i] << endl;
    }

    return 0;
}

注意事项:

  1. 确保输入的图数据是正确的,即节点编号和边的权重都符合实际情况。
  2. 确保起点start的编号在图的范围内。
  3. 由于Dijkstra算法对于负权边的处理不正确,所以要确保图中的边权重都是非负数。
  4. 在C++中使用优先队列作为最小堆来保存待处理的顶点,确保能够按照距离的升序进行处理。

Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家Edsger Dijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。

算法思想:

  1. 初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶点距离设置为无穷大)
  2. 创建一个集合S,用于保存已经找到最短路径的顶点
  3. 重复以下步骤,直到集合S包含所有顶点:
    • 从未包含在集合S中的顶点中,选择距离起点最短的顶点v
    • 将顶点v添加到集合S中
    • 对于v的每个邻接顶点u,如果通过v可以缩短起点到顶点u的距离,则更新距离数组中u的距离值为起点到v的距离加上v到u的边的权重

优点:

  1. Dijkstra算法能够找到起点到各个顶点的最短路径,确保解的正确性。
  2. 算法的时间复杂度较低,对于稠密图和稀疏图都能够高效地求解最短路径问题。

缺点:

  1. 算法要求图中边的权重必须为非负数,否则结果可能不正确。
  2. 当图的规模较大时,Dijkstra算法的时间复杂度较高,不适合处理规模较大的问题。

以下是使用C++语言实现Dijkstra算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

vector<int> dijkstra(vector<vector<pair<int, int>>> graph, int start) {
    int n = graph.size();
    vector<int> distance(n, numeric_limits<int>::max());
    vector<bool> visited(n, false);
    distance[start] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        visited[u] = true;

        for (auto &v : graph[u]) {
            if (!visited[v.first] && distance[u] + v.second < distance[v.first]) {
                distance[v.first] = distance[u] + v.second;
                pq.push({distance[v.first], v.first});
            }
        }
    }

    return distance;
}

int main() {
    int n, m, start;
    cin >> n >> m >> start;

    vector<vector<pair<int, int>>> graph(n);

    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    vector<int> distance = dijkstra(graph, start);

    for (int i = 0; i < n; ++i) {
        cout << "Distance from " << start << " to " << i << ": " << distance[i] << endl;
    }

    return 0;
}

注意事项:

  1. 确保输入的图数据是正确的,即节点编号和边的权重都符合实际情况。
  2. 确保起点start的编号在图的范围内。
  3. 由于Dijkstra算法对于负权边的处理不正确,所以要确保图中的边权重都是非负数。
  4. 在C++中使用优先队列作为最小堆来保存待处理的顶点,确保能够按照距离的升序进行处理。

Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家Edsger Dijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。

算法思想:

  1. 初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶点距离设置为无穷大)
  2. 创建一个集合S,用于保存已经找到最短路径的顶点
  3. 重复以下步骤,直到集合S包含所有顶点:
    • 从未包含在集合S中的顶点中,选择距离起点最短的顶点v
    • 将顶点v添加到集合S中
    • 对于v的每个邻接顶点u,如果通过v可以缩短起点到顶点u的距离,则更新距离数组中u的距离值为起点到v的距离加上v到u的边的权重

优点:

  1. Dijkstra算法能够找到起点到各个顶点的最短路径,确保解的正确性。
  2. 算法的时间复杂度较低,对于稠密图和稀疏图都能够高效地求解最短路径问题。

缺点:

  1. 算法要求图中边的权重必须为非负数,否则结果可能不正确。
  2. 当图的规模较大时,Dijkstra算法的时间复杂度较高,不适合处理规模较大的问题。

以下是使用C++语言实现Dijkstra算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

vector<int> dijkstra(vector<vector<pair<int, int>>> graph, int start) {
    int n = graph.size();
    vector<int> distance(n, numeric_limits<int>::max());
    vector<bool> visited(n, false);
    distance[start] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        visited[u] = true;

        for (auto &v : graph[u]) {
            if (!visited[v.first] && distance[u] + v.second < distance[v.first]) {
                distance[v.first] = distance[u] + v.second;
                pq.push({distance[v.first], v.first});
            }
        }
    }

    return distance;
}

int main() {
    int n, m, start;
    cin >> n >> m >> start;

    vector<vector<pair<int, int>>> graph(n);

    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    vector<int> distance = dijkstra(graph, start);

    for (int i = 0; i < n; ++i) {
        cout << "Distance from " << start << " to " << i << ": " << distance[i] << endl;
    }

    return 0;
}

注意事项:

  1. 确保输入的图数据是正确的,即节点编号和边的权重都符合实际情况。
  2. 确保起点start的编号在图的范围内。
  3. 由于Dijkstra算法对于负权边的处理不正确,所以要确保图中的边权重都是非负数。
  4. 在C++中使用优先队列作为最小堆来保存待处理的顶点,确保能够按照距离的升序进行处理。

Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家Edsger Dijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。

算法思想:

  1. 初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶点距离设置为无穷大)
  2. 创建一个集合S,用于保存已经找到最短路径的顶点
  3. 重复以下步骤,直到集合S包含所有顶点:
    • 从未包含在集合S中的顶点中,选择距离起点最短的顶点v
    • 将顶点v添加到集合S中
    • 对于v的每个邻接顶点u,如果通过v可以缩短起点到顶点u的距离,则更新距离数组中u的距离值为起点到v的距离加上v到u的边的权重

优点:

  1. Dijkstra算法能够找到起点到各个顶点的最短路径,确保解的正确性。
  2. 算法的时间复杂度较低,对于稠密图和稀疏图都能够高效地求解最短路径问题。

缺点:

  1. 算法要求图中边的权重必须为非负数,否则结果可能不正确。
  2. 当图的规模较大时,Dijkstra算法的时间复杂度较高,不适合处理规模较大的问题。

以下是使用C++语言实现Dijkstra算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

vector<int> dijkstra(vector<vector<pair<int, int>>> graph, int start) {
    int n = graph.size();
    vector<int> distance(n, numeric_limits<int>::max());
    vector<bool> visited(n, false);
    distance[start] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        visited[u] = true;

        for (auto &v : graph[u]) {
            if (!visited[v.first] && distance[u] + v.second < distance[v.first]) {
                distance[v.first] = distance[u] + v.second;
                pq.push({distance[v.first], v.first});
            }
        }
    }

    return distance;
}

int main() {
    int n, m, start;
    cin >> n >> m >> start;

    vector<vector<pair<int, int>>> graph(n);

    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    vector<int> distance = dijkstra(graph, start);

    for (int i = 0; i < n; ++i) {
        cout << "Distance from " << start << " to " << i << ": " << distance[i] << endl;
    }

    return 0;
}

注意事项:

  1. 确保输入的图数据是正确的,即节点编号和边的权重都符合实际情况。
  2. 确保起点start的编号在图的范围内。
  3. 由于Dijkstra算法对于负权边的处理不正确,所以要确保图中的边权重都是非负数。
  4. 在C++中使用优先队列作为最小堆来保存待处理的顶点,确保能够按照距离的升序进行处理。

标签:distance,vector,int,graph,迪杰,算法,Dijkstra,源码,顶点
From: https://blog.csdn.net/qq_30247949/article/details/140083847

相关文章

  • JDK动态代理方法Proxy.newProxyInstance源码分析
    JDK动态代理方法Proxy.newProxyInstance源码分析publicstaticObjectnewProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)方法入参解释:ClassLoaderloader:表示对应类加载器,用于加载对应代理类。Class<?>[]interfaces:表示一个接......
  • 短视频矩阵系统搭建教程,短视频矩阵怎么做,矩阵系统源码部署教程
    一、什么是矩阵系统这是一款智能助手系统,融合了账号授权管理、企业账户管理、AI素材库、视频剪辑创作、自动化回复响应、外部链接引流以及视频排名追踪等多重功能。简言之,这是一个助力企业提升短视频营销效果的智能助手平台。系统搭建获取\/:ywxs5787   备注来意二、矩......
  • [开源分享]好用的在线客服系统 PHP客服系统源码 聊天源码(开源代码+终身使用+安装教程
    源码介绍PHP在线客服系统源码采用全新UI,重新设计前端界面,后台采用php+mysql,免费开源源码。在线客服系统已成为企业与客户之间沟通的重要渠道。通过在线客服系统,企业可以方便地与客户进行实时沟通和解决问题,提升客户满意度。php客服系統源码主要功能要求:全新UI自动回复和机器......
  • ORB-SLAM3 源码分析
    一、ORB-SLAM3介绍ORB-SLAM3是一个先进的同时定位与地图构建(SimultaneousLocalizationandMapping,SLAM)系统,实现了基于视觉惯导紧耦合,同时能够对多地图进行复用;另外支持单目/双目/RGB-D作为输入,支持针孔以及鱼眼相机模型。是目前种类最齐全、工程化最好、精度和鲁棒性整体最佳的......
  • springboot校企对接实习管理系统 毕业设计-附源码11959
    摘 要校企合作实习是一种重要的实践教学模式,但是在实际的推行过程中,存在许多管理问题。其中包括远程指导困难、学生管理困难、校企信息沟通不畅等问题一直困扰着校方负责管理实习的教师们。随着互联网系统开发技术的发展,应用web技术开发B/s模式的实习管理系统,根据用户需......
  • Java计算机毕业设计粮库商品管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农业现代化和粮食流通体系的不断完善,粮库商品管理面临着日益复杂的挑战。传统的粮库管理方式往往依赖于人工记录和纸质文档,效率低下且易出错。同......
  • Java计算机毕业设计农资网络销售系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和农业现代化的推进,农资行业正面临转型升级的重大机遇。传统的农资销售模式往往依赖于实体店面和线下交易,效率低下且成本高昂......
  • Java计算机毕业设计汉服文化平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着近年来“国学热”的兴起,汉服文化作为中华传统文化的重要组成部分,逐渐受到越来越多人的关注和喜爱。汉服不仅承载着中华民族的历史记忆,更是传统礼......
  • 如何选择适合您业务需求的多语言跨境电商系统源码
    随着互联网技术的飞速发展和全球市场的日益融合,多语言跨境电商已经成为许多企业进军国际市场的重要战略。在这个竞争激烈的时代,拥有一个适合自己业务需求的多语言跨境电商系统源码至关重要。本篇文章将为您揭秘如何选择适合您业务需求的多语言跨境电商系统源码,带您深入了解这个......
  • 直播电商APP源码
            你有没有想过,如何通过手机就能够触手可及地购买到你想要的商品呢?直播电商APP源码,为你带来了全新的购物体验。它不仅为用户提供了便捷快速的购物平台,还为商家提供了一个高效的销售渠道。武汉迅狐科技有限公司研发的直播电商APP源码,打破了传统电商模......