最短路径问题——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, ...
随机推荐
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...
- consul笔记-集群加入的问题
加入集群的问题 1 只有2个server的时候,一个挂掉,不会选举出新的leader. 2 使用 -bootstrap 可以直接启动为leader,这和-bootstrap-expect 是有区别的 ...
- Java中Object类
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类. Object类中的方法,适合所有子类. Object中的几个重要方法: 1 ...
- px和em的区别(转)
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...
- 深入浅出设计模式——建造者模式(Builder Pattern)
模式动机无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单 ...
- hdu2296Ring(ac自动机+dp)
链接 dp[i][j]表示长度为i在节点J的时候的权值最大值,根据trie树转移一下就行,需要每次都取最小的,所以需要另开一数组保存字典序最小的状态. #include <iostream> ...
- 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异
今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...
- android音视频点/直播模块开发
音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...
- MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...
- Gradle version 2.2 is required. Current version is 2.14.1.
gradle版本错误: 1. 修改gradle\wrapper\gradle-wrapper.properties文件: distributionUrl=https\://services.gradl ...