Dijkstra算法

算法的基本思想就是 从起点开始  找到距离它最短的点 然后从那个点出发 更新相邻顶点的最短距离

下面用这个图当作例子解释一下   A是起点

数组d来表示起点到各个点的最短距离  刚开始A除了到B C剩下的都到不了 是INF

第一轮找出最短的 是B 然后A到B的距离是2 固定不变了  A到其他点的距离就是B到其他点的距离加2

以此来更新其他点   每次都选择那些没被选过的中最小的  然后更新其相邻的点

具体  看下面的表格 走一遍就清楚了

轮数 A B C D E F G 选择
1 0 2 5 INF INF INF INF B
2 0 2 5 8 12 INF INF C
3 0 2 5 7 INF INF INF D
4 0 2 5 7 INF 8 INF F
5 0 2 5 7 11 8 17 E
6 0 2 5 7 11 8 16  

核心代码

int Dijkstra(){fill(d,d+n+1,INF);fill(vis,vis+n+1,false);for(int i=1;i<=n;i++)d[i]=e[s][i];//更新初始状态vis[s]=true;d[s]=0;while(true){int flag=-1;for(int i=1;i<=n;i++){//选择最短的路径if((!vis[i])&&(flag==-1||d[i]<d[flag])) flag=i;}if(flag==-1)break;vis[flag]=true;for(int i=1;i<=n;i++){//更新其他相邻的路径if(!vis[i])d[i]=min(d[i],d[flag]+e[flag][i]);}}
}

练习题

模板题hihocoder1081

ac代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000+7;
const int INF=0x3f3f3f3f;
int d[maxn],e[maxn][maxn];
bool vis[maxn];
int n,m,s,t,u,v,w;
int Dijkstra(){fill(d,d+n+1,INF);fill(vis,vis+n+1,false);for(int i=1;i<=n;i++)d[i]=e[s][i];//更新初始状态vis[s]=true;d[s]=0;while(true){int flag=-1;for(int i=1;i<=n;i++){//选择最短的路径if((!vis[i])&&(flag==-1||d[i]<d[flag])) flag=i;}if(flag==-1)break;vis[flag]=true;for(int i=1;i<=n;i++){//更新其他相邻的路径if(!vis[i])d[i]=min(d[i],d[flag]+e[flag][i]);}}
}
int main(){cin>>n>>m>>s>>t;memset(e,INF,sizeof(e));while(m--){scanf("%d%d%d",&u,&v,&w);if(w<e[u][v]){//u v之间可能有多条路e[u][v]=w;e[v][u]=w;}}Dijkstra();printf("%d\n",d[t]);
}

Dijkstra算法(单源最短路)相关推荐

  1. PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:dijkstra求单源最短路的题目. 只是写两遍而已,第一遍求按照路径长度求,第二遍按照时间最少求. 另外加一个vector路径的判断 ...

  2. CSP认证201609-4 交通规划[C++题解]:最短路径树、dijkstra求单源最短路、递推思想

    题目分析 来源:acwing 分析: 这题是最短路树.保持原图中所有点到根结点的最短距离不变,然后在原图中选择一些边,使所有点连通的最短路是多长. 最短路径树,是一种使用最短路径算法生成的数据结构树. ...

  3. 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路

    暑假只有最开始的几天最有意思,考完试玩了几天就感觉到了无聊.抱着想要出去走走的心态,我制定了一个出行路线图,我在1号城市,想去看一看2,3,4,5号城市(每去一个城市都从1号城市出发),一切准备就绪, ...

  4. Dijkstra求单源最短路

    849. Dijkstra求最短路 I 题目 提交记录 讨论 题解 视频讲解 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 1 号点到 n 号点的最短距离 ...

  5. 你必须会的--Dijkstra算法--单源最短路径问题

    文章目录 一.算法原理 1.基本原理 2.如何保存最短路径? 二.算法实战一 1.测试 2.结果 二.算法实战2 Input Output Sample Input Sample Output 一.算 ...

  6. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  7. PAT甲级1087 All Roads Lead to Rome (30分):[C++题解]dijkstra求单源最短路综合、最短路条数、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 首先这是一道dijkstra算法求最短路的题目,不过此题较为复杂.首先需要将字符串城市名映射成数字,这里使用hash table 名 ...

  8. Dijkstra(单源最短路算法)

    typedef struct gra{  //顶点 int val; int weight; }graph; graph g[1005][1005],dist[1005]; //图  和  最短路径 ...

  9. PAT甲级1030 Travel Plan (30分):[C++题解]dijkstra求单源最短路、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析 dijkstra模板默写过来,然后多了一个保存路径,使用数组pre[N]记录最短路上每个点的前驱,通过pre数组保存到vector中 v ...

  10. Dijkstral算法--单源最短路

    问题概述:成都的大街上有n个路口,标号为1的路口是学校所在地,标号为n的路口是家所在地,m则表示在成都有几条路,输入3个整数a.b.c表示从a路口到b路口有路可走,且要花费c分钟,求从学校到家最短时间 ...

最新文章

  1. java火山_各种排序算法java实现
  2. 【剑指offer】_18 数据流中的中位数
  3. xdoj判断堆栈出栈序列是否有效c++
  4. 东明县计算机学校,东明县职业中等专业学校2021年招生信息
  5. WPF之Binding的三种简单写法
  6. 机器学习算法总结之XGBoost(上)理论基础
  7. vsftp 使用虚拟用户
  8. 上海 day16 -- python 常用模块1
  9. 前端pdf禁止下载功能
  10. 智遥工作流调用SAP基础数据,解决方案
  11. 发展农村数字普惠金融的问题及对策分析
  12. Linux进阶 | 超详细全方面的Docker Swarm Web集群介绍与部署!
  13. 80386 Programmer's Manual: Chapter 9 Exceptions and Interrupts(Personal Translation)
  14. 软件定义汽车的关键—车载操作系统
  15. JPA 查询 未查询到时返回的list的size为0 但是引用并不为空
  16. office使用技巧大全
  17. Buffon投针实验:究竟为什么是pi?
  18. signature=a335cd7040789f936f75c72e4ba37676,浅谈新教材Reading的整体教学
  19. 解决 WebStorm 很卡的问题
  20. 电脑使用越来越慢,如何解决

热门文章

  1. Servlet(Request.Response)+文件上传
  2. makefile函数集锦【转】
  3. 360换机 v2.12.5.9 官方安卓版
  4. git cherry pick用法
  5. CentOS 6.5下安装Docker
  6. Java To CSharp源代码转换
  7. 频繁项集挖掘算法之FPGrowth
  8. 2016OSC源创会年终盛典-架构数据场-陈沙克
  9. Survivor空间溢出实例
  10. thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)