dijkstra(狄克斯特拉)知识点

1、可以用于解决最短路问题
2、dijkstra算法在数据量比较小的情况下可以直接开邻接矩阵。
3、不能处理含有负权环的图

对dijkstra算法的理解

dijkstra算法有点类似贪心

每次都把周围的与目前的源点相连的点先搜一遍,把最短距离更新一遍,然后看哪个点近,把它当成下一个源点继续搜,同时不断更新距离。搜完所有的点后,就得到了源点到所有的点的最短距离。

一些变量的意思

mp[i][j]=value表示图中存在由i到j的路,这条路的权值为value。读图的时候,如果题目允许两个顶点之间有多条边,那么为了得到最短距离,在存图的时候最好加上

if(mp[a][b]>c)//两个城镇之间允许有多条不同长度的路 mp[a][b]=mp[b][a]=c;

dis[]数组记录最短距离,这个数组在算法执行的过程中是存储着这个过程当中暂时的最短距离,直到算法执行完后,所有的最短距离才是确定并且正确的。(更新距离的时候用的贪心)

book[]数组用于标记是否搜过。
题目
HDU 2544
http://acm.hdu.edu.cn/showproblem.php?pid=2544HDU
HDU 1874
http://acm.hdu.edu.cn/showproblem.php?pid=1874

HDU 2544
代码

#include <cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
const int INF=0x3f3f3f3f;
int mp[105][105];//存储图
int dis[105];//dis数组,存储估计值
int book[105];//book[i]代表这个点有没有被当做源点去搜索过,避免了重复搜索
int n,m;//顶点数,边数
//dijkstra算法,即狄克斯特拉算法,不能用于包含负权值的 。
void dijkstra(int u)
{memset(book,0,sizeof(book));//把每个点的最短距离都先设置为无穷大 int start=u;//从源点开始搜索for(int i=1;i<=n;i++)dis[i]=mp[start][i];//先更新一遍,没有直接与源点相连的点为INF dis[1]=0;//源点,距离0 book[start]=1;//先标成搜过 for(int i=1;i<=n-1;i++)//一共搜索n-1个点,最后一个点没法再往后面搜索了,故n-1就结束 {int minn=INF;//这里代表的是最近点到源点的距离,start代表最近的点 for(int j=1;j<=n;j++)//对于每一个源点,都把源点后面的所有的点都搜索一遍 (这个for目的是找到下一个搜索的节点) {if(!book[j]&&minn>dis[j])//如果处在源点后面的,目前遍历的点没有搜索过,并且距离比我们用minn存储的暂时的最短距离还要短 {minn=dis[j];//那么,就更新这个暂时的最短距离minn  start=j;//然后将这个离源点最近的点保存起来,用于搜索 }}book[start]=1;//接下来把这个已经确定的,离上一个源点最近的节点标记为搜索过,因为接下来要搜索它了 for(int j=1;j<=n;j++)//遍历所有的点,这个for用来修改最短路的值 if(!book[j]&&dis[j]>dis[start]+mp[start][j])dis[j]=dis[start]+mp[start][j];//用新的点来更新dis }//程序跑完后,原先只是暂时的估计的最短的距离,成功都被更新为了真实的最短距离。
}
int  main()
{while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;memset(mp,INF,sizeof(mp));for(int i=1;i<=m;i++)//边{int a,b,c;scanf("%d%d%d",&a,&b,&c);mp[a][b]=c;mp[b][a]=c;}dijkstra(1);//以1为源点进行搜索if(dis[n]==INF)printf("-10086\n");elseprintf("%d\n",dis[n]);   }return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=1874
HDU1874
代码

#include <cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
const int INF=0x3f3f3f3f;
int mp[205][205];//存储图
int dis[205];//dis数组,存储距离
int vis[205];//vis[i]代表这个点有没有被当做源点去搜索过,避免了重复搜索
int n,m;//顶点数,边数
void dijkstra(int s)
{memset(vis,0,sizeof(vis));for(int i=0;i<n;i++)dis[i]=mp[s][i];dis[s]=0;vis[s]=1;for(int i=0;i<n;i++){int minn=INF;for(int j=0;j<n;j++)if(!vis[j]&&dis[j]<minn)//如果没有搜索过,并且距离更小 {minn=dis[j];s=j;}vis[s]=1;for(int j=0;j<n;j++)if(!vis[j]&&dis[j]>dis[s]+mp[s][j])dis[j]=dis[s]+mp[s][j];}
}
int main()
{int s,t;//起点,终点 while(scanf("%d%d",&n,&m)!=EOF){memset(mp,INF,sizeof(mp));for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(mp[a][b]>c)//两个城镇之间可能有多条不同长度的路 mp[a][b]=mp[b][a]=c;}scanf("%d%d",&s,&t);dijkstra(s); if(dis[t]==INF)printf("-1\n");elseprintf("%d\n",dis[t]);}return 0;
}

知识点四 图论:dijkstra (HDU 2544 +HDU 1874)相关推荐

  1. 图论:SPFA 算法详解( 算法竞赛入门到进阶) HDU 2544 链式前向星 【提供ACM模板+图解,不会都难!】

    文章目录 SPFA简介 链式前向星介绍 SPFA算法思路详细 模板-链式前向星 参考书籍:算法竞赛入门到进阶 罗勇军 SPFA简介 用队列处理Bellman-Ford算法可以很好地优化,这种方法叫做S ...

  2. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  3. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...

  4. C语言指针基础知识点(四)--通过指针引用数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  5. 母函数+例题(hdu 2079+hdu 2082)

    母函数+例题(hdu 2079+hdu 2082) 虽然ACM的确有点力不从心,但是还是贵在坚持,继续啃啃算法..... 昨天一个下午学了学母函数,离散数学+幂级数,只能说nb- 看了半天的原理,结果 ...

  6. hdu 2544 最短路 (dijkstra)

    http://acm.hdu.edu.cn/showproblem.php?pid=2544 最简单的最短路了吧 改天试试优化版本的 #include<stdio.h> #include& ...

  7. hdu 2544 最短路 Dijkstra算法

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  8. hdu 2544 dijkstra

    链接矩阵+优先队列 #include <iostream> #include <cstring> #include <set> #include <queue ...

  9. HDU 2544最短路dijkstra模板题

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

最新文章

  1. SQLServer数据库如何收缩日志空间?
  2. 程序员如何用Java排序
  3. 【Docker】记一次docker container ping domain 和 ping ipv6地址不通问题
  4. Js将字符串转数字的方式
  5. Pycharm远程链接矩池云报错踩坑记录
  6. 哈工大离散数学期末试题2021回忆版
  7. 电路板上的这些标志你都知道是什么含义吗?——详解电子产品认证类型
  8. [Android-ARCore开发]ARCore从入门到放弃1-Demo上手
  9. 用计算机读取三菱PLC程序,电脑如何读取与保存三菱plc数据?
  10. 物理定律告诉你:表白可能巨亏,分手一定血赚
  11. oracle11g认证,ORACLE11g-OCP认证(甲骨文专家级数据库工程师)
  12. meo学习笔记5:C++中的类型转换概述
  13. 为什么剩余数不能相加_为什么花的钱剩下的相加不等于花去的数
  14. JPA实现领域驱动设计(DDD) 中值对象的持久化
  15. 高通Display架构
  16. 羞羞的和成人机器人恋爱,或许这是“寂寞经济”催生的新风口
  17. 物联网技术可以给养老院带来哪些变化
  18. zedgraph显示最小刻度_ZedGraph 控件各属性以及示例
  19. 关于对比损失(contrasive loss)的理解(相似度越大越相似的情况):
  20. matlab产生BPSK信号

热门文章

  1. 东南亚跨境电商如何做测评自养号
  2. 加密世界“众生相”:僧侣、信徒和骗子
  3. [译]Veil-Pillage
  4. Python 增加时间戳和今日日期
  5. CentOS 7 开机自启汇总
  6. QQ密技60招!(上)有的很有用!
  7. Springboot整合Poi导出excel(简单版)
  8. 三、外码、关系的完整性约束、关系代数
  9. 韵脚与押韵的练习(十三韵)
  10. Python警告控制模块:warnings