C++实现Dijkstra(迪杰斯特拉)算法

 更新时间:2020年05月27日 15:04:47   作者:赏星乐事  
这篇文章主要为大家详细介绍了C++实现Dijkstra(迪杰斯特拉)算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,是广度优先算法的一种,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。 Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

Dijkstra 算法的时间复杂度为O(n^2)

空间复杂度取决于存储方式,邻接矩阵为O(n^2)

代码实现

#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
#define INF 0x7fffffff
#define maxN 50
#define USE_C 1
#define NOT_USE_C 0
#define USE_CPP 1
int matrix[maxN][maxN];
void Dijkstra_cpp(vector<vector<int>>&vec,vector<int>& result,int v0){
  vector<int> visited(vec.size(),0);
  int last_visitied = 0;
  result[0] = 0;
  for(int i =0;i<vec.size()-1;i++){
    for(int j = 0;j<vec.size()-1;j++){
    if(visited[i]==0){
      if(vec[v0][j]!= 0){
      int dist =vec[v0][j] +last_visited;
      if(dist<result[j])
      result[j] = dist;
    }
  }
}
  int minIndex = 0;
  while(visited[minIndex] == 1)
    minIndex++;
  for(int j = minIndex;j<vec.size();j++){
    if(visited[j] ==0&&result[j]<result[minIndex]){
      minIndex = j;
    }
  }
  last_visited = result[minIndex];
  visited[minIndex] = 1;
  v0 = minIndex;
  }
} 
int _tmain(int argc,_TCHAR* argv[]){
  freopen("Dijkstra2Data.txt","r",stdin);
  int n;
  cin>>n;
  vector<vector<int>> vec(n,vector<int>(n,0));
  for(i = 0;i<n;i++){
    for(j = 0;j<n;j++){
      cin>>vec[i][j];
    }
  }
  vector<int> result(n,INF);
  Dijkstra_cpp(vec,result,0);
  for(int i =0;i<n;i++){
    if(result[i] == INF)
    cout<<"INF"<<endl;
    else
    cout<<result[i]<<endl;
  }
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • visual studio 2015下boost库配置教程

    visual studio 2015下boost库配置教程

    这篇文章主要为大家详细介绍了visual studio 2015下boost库的配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 详解应用程序与驱动程序通信DeviceIoControl

    详解应用程序与驱动程序通信DeviceIoControl

    这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction为IRP_MJ_DEVICE_CONTROL,MinorFunction为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数
    2021-06-06
  • opencv实现图像平移

    opencv实现图像平移

    这篇文章主要为大家详细介绍了opencv实现图像平移,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言库函数getchar()新见解

    C语言库函数getchar()新见解

    用getchar()函数读取字符串时,字符串会存储在输入缓冲区中,包括输入的回车字符,下面这篇文章主要给大家介绍了关于C语言中getchar()的用法以及案例的相关资料,需要的朋友可以参考下
    2022-07-07
  • 详解C语言如何实现双向带头循环链表

    详解C语言如何实现双向带头循环链表

    双向带头循环链表应该是链表中非常方便的一种,可以很容易的在任意位置上进行插入和删除,可以很容易的对链表进行管理。本文将利用C语言实现双向带头循环链表,需要的可以参考一下
    2022-08-08
  • C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

    C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

    本篇文章是对在C语言中解决不用+、-、×、÷数字运算符做加法的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt项目打包的实现步骤

    Qt项目打包的实现步骤

    本文主要介绍了Qt项目打包的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C/C++连接MySQL数据库详细图文教程

    C/C++连接MySQL数据库详细图文教程

    在实际开发中我们经常需要对数据库进行访问,下面这篇文章主要介绍了C/C++连接MySQL数据库的详细图文教程,文中通过代码以及图文介绍是非常详细,需要的朋友可以参考下
    2024-01-01
  • C++初始化列表学习

    C++初始化列表学习

    在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示
    2013-09-09
  • 解析c++ 中智能指针引用计数为什么不是0原理

    解析c++ 中智能指针引用计数为什么不是0原理

    这篇文章主要为大家介绍了C语言中智能指针引用计数为什么不是0原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论