最短路径问题——dijkstra算法
仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法)。开辟一个结构体,其变量为边的终点和边权,这时候还需要一个这个结构体类型的数组,数组的下标则为边的始点,我们都知道在图中,一个始点连出去的可能不止一条边,这样的话就类似用到一个二维数组了,我们在arr[][]的第一维存放的是边的始点,第二维则是这个始点对应的不同终点及其权值,学过邻接表的人应该就能看出来这就是一个邻接表了呗!
而对于邻接表的实现这里我选择的是用使一个vector容器,vector的一大好处在于对于数组的空间大小分配它可以自动合理处理(此处仅为个人理解,想要清楚具体了解vector请见书或者百度),说到这儿我的各条边算是在邻接表中存好了,那具体要如何实现最短路径,我还需要一个堆,一个小顶堆,对于源点s,它的dis[s]=0(dis[]数组存储的是源点到该点的最短距离)这个时候我们将dis[s]和它对应的终点(这个时候依旧是s)存入堆当中,然后从堆中提出dis【】最小的点,利用邻接表找到它的每一个相邻的点,也就是以它为起点的每一个终点,如果终点的dis已经小于起点了,那就继续,否则判断,如果终点的dis大于起点的dis加上这条边对应的边权的和,那么改变终点的dis,并把其存入堆中。。。可能有点混乱,那就看代码吧:
#include<iostream>
#include<vector>
#include<queue>
#define INF 10000000
using namespace std;
struct eg
{
int t;
int c;
eg(int t1,int c1) //一个构造函数
{
t=t1;
c=c1;
}
};
typedef pair<int,int>p;
vector<eg>G[100];
int dis[100];//用于存储源点到该点的最短距离
priority_queue< p,vector<p>,greater<p> > que;//加上vector<p>,greater<p>后实现的则是一个小顶堆,不然实现的是一个大顶堆
void dijkstra(int s)
{
fill(dis,dis+100,INF);//先对每一个点的dis赋初值为一个极大数
dis[s]=0;//源点到源点
que.push(p(0,s));
while(!que.empty())
{
p p1=que.top();
que.pop();
if(dis[p1.second]<p1.first) continue;
int size=G[p1.second].size();
for(int j=0;j<size;j++)
{
eg e=G[p1.second][j];
if(dis[e.t]>p1.first+e.c)
{
dis[e.t]=p1.first+e.c;
que.push(p(p1.first+e.c,e.t));//需要注意的是存入堆中的到底是什么
}
}
}
}
void solve()
{
int V,E;
cin >> V >> E;
for(int i=0;i<E;i++)
{
int s1,t1,c1;
cin >>s1 >> t1 >> c1;
G[s1].push_back(eg(t1,c1));//按源点s1存储
}
int s;
cin >> s;
dijkstra(s);
int t;
cin>> t;
cout << dis[t] << endl;
}
int main()
{
solve();
return 0;
}
最短路径问题——dijkstra算法的更多相关文章
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
- 最短路径 | 深入浅出Dijkstra算法(一)
参考网址: https://www.jianshu.com/p/8b3cdca55dc0 写在前面: 上次我们介绍了神奇的只有五行的 Floyd-Warshall 最短路算法,它可以方便的求得任意两点 ...
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- python数据结构与算法——图的最短路径(Dijkstra算法)
# Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...
- 最短路径之Dijkstra算法及实例分析
Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图.首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径.它的初始 ...
- HDU1548——A strange lift(最短路径:dijkstra算法)
A strange lift DescriptionThere is a strange lift.The lift can stop can at every floor as you want, ...
随机推荐
- shell中 "" 跟 ''的区别
在bash里,这两个都是引号,用来表明字符串,区别是,双引号中的变量会被展开,而单引号中不再展开.举个例子:a="abc"echo "str=$a" # 结果显 ...
- 448. Find All Numbers Disappeared in an Array Add to List
题目描述 题目分析 有个[1,n]的条件要充分利用起来. 题目代码 public class Solution { public List<Integer> findDisappeared ...
- windows下开启mysql远程访问
USE mysql;SELECT * FROM USER ; 直接修改user=root host=127.0.0.1为% FLUSH PRIVILEGES;
- POI导出excel的简单demo
目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...
- nodejs的第一天学习笔记
一. js的模块化 什么是模块化: 模块化的概念最早是后台,随着ajax技术的兴起,js在编程中所占的地位越来越高,同时js的文件也相应的越来越多.为了方便文件的管理和更新,提出了js文件的模块 化, ...
- [原创] WINDOWS 7 精简教程之驱动精简 可用于64和32
追风神话 发表于 2014-9-1 11:35:56 https://www.itsk.com/forum.php?mod=viewthread&tid=334491&highli ...
- Spring Boot工程发布到Docker
先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...
- iOS下载使用系统字体
iOS下载使用系统字体 通用开发中一般使用系统默认的字体: 另外系统也提供了一些其他字体我们可以选择下载使用 1:在mac上打开 字体册 app 即可查找系统支持的字体,适用于ios上开发使用 从ma ...
- Java 泛型,了解这些就够用了。
此文目录: Java泛型是什么? 通常的泛型的写法示例 类型擦除 为什么要使用Java泛型 通过示例了解PECS原则 一.Java泛型是什么? 官方定义 泛型是Java SE 1.5的新特性,泛型的本 ...
- 请尝试使用 Console.Read。错误原因
当出现错误: 如果应用程序没有控制台或控制台输入已通过文件进行了重定向,则无法读取键.请尝试使用 Console.Read. 一定是在非控制台应用程序中用了Console.ReadKey(); Con ...