最短路径问题——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, ...
随机推荐
- HMI开发与控件
=>控件是什么概念? 百度曰,控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者. 对于HMI开发来说,使用控件可以快速获取到用户的交互(包括按下.释放.点击.拖动 ...
- centos7 中libgdiplus的安装
yum -y install libtool* git clone git://github.com/mono/libgdiplus.git cd libgdiplus ./autogen.sh -- ...
- linux下启动AP热点时出错
1.启动hostapd,在终端下输入sudo ./hostapd hostapd.conf (注意:使用到的hostapd和hostapd.conf都处在当前工作目录下) 1.2.在执行1之后会出现以 ...
- CSS背景样式
CSS是级联样式表,用来表现HTML等文件样式的语言,CSS能够真正做到网页的表现与内容分离的设计语言,也就是说,做好了一款网页,可以通过另一个后缀名是css的文件进行修改其中的样式,不过在html的 ...
- 《BI那点儿事》数据流转换——多播、Union All、合并、合并联接
建立测试数据: CREATE TABLE FactResults ( Name ) , Course ) , Score INT ) INSERT INTO FactResults ( Name , ...
- 01 Node.js简介, 安装&配置
Node.js 简介 Node.js 是什么 Node.js 有着强大而灵活的包管理器(node package manager,npm) 目前, 已经有强大第三方工具模块, 例如数据库连接, 网站开 ...
- zoj3494BCD Code(ac自动机+数位dp)
l链接 这题想了好一会呢..刚开始想错了,以为用自动机预处理出k长度可以包含的合法的数的个数,然后再数位dp一下就行了,写到一半发现不对,还要处理当前走的时候是不是为合法的,这一点无法移到trie树上 ...
- Mvc导入导出Excel
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2&g ...
- 位域 unsigned int a : 4;
位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数 ...
- GreenPlum简单性能测试与分析--续
版权声明:本文由黄辉原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/259 来源:腾云阁 https://www.qclou ...