实用算法实现-第 20 篇 单源最短路径

贪心算法求单源最短路径(迪杰斯特拉算法) Dijkstra算法是最具代表性的解单源最短路径问题的贪心算法。 阅读详情
 

20.1    Dijktra算法

Dijktra算法适用于有向图上带权的单源最短路径,但是要求所有边的权值非负。所以它一方面比Ford性能好,一方面又没有Ford算法的通用性。

对比Dijktra算法和Prim算法,可以发现两者的相似之处。

20.1.1    实例

PKU JudgeOnline, 3268, Silver Cow Party.

20.1.2    问题描述

一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。

每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。

求每头牛要来回的最短时间。

20.1.3    输入

第一行:三个用空格分开的整数:N,M和X

第2到第M+1行:第i+1描述路i,通过三个用空格分开的整数: Ai, Bi和Ti. 是对于从Ai号田到 Bi号田的描述,需要Ti的时间.

20.1.4    输出

第一行:一个整数:对于每头牛所必须花费的时间.(在这段时间内,每头牛可以来回)

20.1.5    分析

母牛要到X农场去,可以看做从N农场回来的逆过程,不过这个逆过程要考虑好路径的方向问题,因为这里的路径是有方向的。而从X农场回来只要再次执行Dijktra算法就能完成了。

20.1.6    程序

#include <stdio.h>

#include <iostream.h>

#include <string.h>

#define MAX_NUM        1002

int route[MAX_NUM][MAX_NUM];

int N, M, X;

int d[MAX_NUM];

int d1[MAX_NUM];

bool visited[MAX_NUM];

#define MAX   0x7F7F7F7F

void Dijktra(int s, bool back)

{

     int i, j;

     int minU;

     int U;

     memset(d, 0x7F, sizeof(d));

     memset(visited, 0, sizeof(visited));

     d[s] = 0;

     while(1){

         minU= MAX;

         for(i = 1; i <= N; i++){

              if(visited[i] == false && minU > d[i]){

                   minU = d[i];

                   U = i;

              }

         }

         if(minU == MAX)

              break;

         visited[U] = true;

         for(j = 1; j <= N; j++){

              int distance;

              if(back == true){

                   distance = route[U][j];

              }else{

                   distance = route[j][U];

              }

              if(distance == MAX){

                   continue;

              }

              if(d[j] > distance + d[U]){

                   d[j] = distance + d[U];

              }

         }

     }

}

int main()

{

 

     int i;

     int from, to;

     int dis;

     int max;

     memset(route, 0x7F, sizeof(route));

     cin >> N >> M >> X;

     for(i = 0; i < M; i++){

         cin >> from >> to >> dis;

         if(route[from][to] > dis)

         {

              route[from][to] = dis;

         }

     }

     Dijktra(X, false);

     memcpy(d1, d, sizeof(d));

     Dijktra(X, true);

     max = 0;

     for(i = 1; i <= N; i++){

         if(max < d[i] + d1[i]){

              max = d[i] + d1[i];

         }

     }

     cout << max << endl;

     return 1;

}

20.2    实例

PKU JudgeOnline, 3268, Silver Cow Party.

PKU JudgeOnline, 1122, FDNY to the Rescue!.

PKU JudgeOnline, 1502, MPI Maelstrom.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

单源最短路径问题Dijkstra算法的c语言实现        求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值是依照图赋的,邻接节点赋对应边的权值,其他节点赋无穷大)。在Dijkstra算法的每一个阶段,将未处理的节点放入一个集合S,扫描S中距离最小的一个节点v,将v置为处理状态。然后在剩下的所... 阅读详情

相关推荐

【分支限界算法】单源最短路径Python实现

【分支限界算法】单源最短路径Python实现

丷从心·的博客 1553

C语言贪吃蛇最短路径,AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈。一、Dijkstra算法原理作为一种广为人知的单源最短路径算法,Dijkstra用于求解带权有向图的单源最短路径的问题。所谓单源,就是一个源头,也即一个起点。该算法的本质就是一个广度优先搜索,由中心向外层层层拓展,直到遇到终点或者遍历结束。该算法在搜索的过程中需要两个表S及Q,S用来存储已...

weixin_30462741的博客 2869

带负权图的单源最短路径算法:Bellman-Ford算法

前面介绍过图的单源最短路径算法Dijks

杂的文 6624

POJ 3268 Silver Cow Party

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20274   Accepted: 9278 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently

苦鬼·。 344

贪心算法-Djkstra求解无向图单源最短路径

Djkstra求解无向图单源最短路径 图论中有很多很经典的问题和算法思想,如最小生成树,DFS,BFS,Powell染色问题等等。最短路径问题也是其中的经典问题之一,在地图导航等领域非常常用。求解最短路径的常用算法有Dijkstra算法、Floyd算法等等。前者只能求解单源最短路径,后者可以求解任意源到任一点的最短路径,后者的复杂度要比前者高。 在这里具体阐述一下Dijkstra算法求解单源最短路径的基本算法思想: 首先需要做的是创建一个空集S,表示已经遍历过的节点的集合。 选定好源点O之后,便要把源点O放

旎彩的博客 1994

单源最短路径算法设计

#单源最短路径算法设计 问题描述: 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。 输入: 第一行,分别表示为 源点,顶点个数,单源路径个数。 其余各行分别表示为 起点,终点,对应权值。 如下: 1 5 7 1 2 20 1 5 50 1 4 60 2 3 30 3 5 10...

qq_41821869的博客 1010

POJ 3268 Silver Cow Party

题意: 描述 一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。 每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。 求每头牛要来回的最短

小马的博客 333

深入解析BLheli电调固件与Dshot通讯协议:从原理到实践

本文深入解析了无人机动力系统的核心——BLheli电调固件与Dshot通讯协议。详细阐述了BLheli固件从经典版到BLheli_32的演进及其功能特性,并重点剖析了Dshot数字协议如何通过数据包和校验码实现更快、更准、更可靠的电机控制。文章还涵盖了双向Dshot遥测、实战配置与调参指南,帮助玩家充分释放无人机性能。

weixin_28273593的博客 436

POJ-3268-Silver Cow Party

描述: 块田中(1≤N≤1000)都有1只牛去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M( 1≤M≤100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。每头母牛必需参加宴会并且在宴会结束时回到自己的田地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。求每头牛要来回的最短时间。 找出来回路程最长的。输

z309241990的专栏 477

Sourcetree与Gitee的搭配使用

初次将gitee与sourcetree联合起来使用,还是遇到了不少问题,其中最让人烦恼的就是在我修改了一下用户名之后,便无法在Sourcetree直接推送到gitee,很是让人郁闷。本文处理Sourcetree与gitee搭配使用过程中的问题:Sourcetree身份验证失败,无法推送;Sourcetree推送时,无法显示要推送的分支;Sourcetree远端上面有感叹号。

年少时的棉花糖 4434

ST MCSDK V6.2.0实战:手把手教你配置HSO-ST观测器,体验500ms收敛的电机无感控制

本文详细介绍了ST MCSDK V6.2.0中HSO-ST观测器的配置方法,实现500ms内电流收敛的无感电机控制。从环境搭建、核心参数解析到无感启动优化,提供实战技巧和性能调优策略,帮助开发者快速掌握高效电机控制技术。

weixin_28720767的博客 580

JAVA编程求单源最短路径_实用算法实现-第 20 篇 单源最短路径

Dijktra算法适用于有向图上带权的单源最短路径,但是要求所有边的权值非负。所以它一方面比Ford性能好,一方面又没有Ford算法的通用性。对比Dijktra算法和Prim算法,可以发现两者的相似之处。20.1.1 实例PKU JudgeOnline, 3268, Silver Cow Party.20.1.2 问题描述一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚...

weixin_27330481的博客 271

WorkBench3.2 + VxWorks6.8安装教程

按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎...

Alive的博客 3万+

单源最短路径(Dijkstra算法)

迪杰斯特拉(Dijkstra)算法 定义 Dijkstra(迪杰斯特拉)算法是计算单源最短路径算法,用于计算一个结点到其他所有结点的最短路径。该算法以源点为起始点,不断更新其他点到已经确定距离结点的距离,选取距离最小的结点加入S集合,直到S集合存放有所有的结点 算法思想 现在一张图中有n个结点,有两个集合,S集合和V集合。S集合表示已经选取的结点,V集合表示还没有选取的结点 确定一个源点,放入S...

长期更新自学笔记 2万+

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1589

单源最短路径(Dijkstra算法)——Python实现

Dijkstra算法

lime2019的博客 5151

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1290

单源最短路径问题c++实现(贪心算法)

单源最短路径算法c++实现(贪心算法)

haust_允谦的博客 6506

第229篇 轨迹时间参数化——TOPP-RA和速度约束处理

本文介绍了时间最优路径参数化(TOPP)问题及其解法。TOPP研究如何在给定空间路径上分配时间,使机器人运动时间最短且不超速,需满足速度、加速度和力矩约束。经典解法采用相平面法,通过前向和后向扫描确定最优速度曲线。TOPP-RA改进了数值稳定性,支持多约束处理。文章对比了TOPP与轨迹优化的区别,列举了开源工具,并解答了面试常见问题,指出TOPP广泛应用于机械臂、AGV等领域。TOPP不改变路径形状,仅优化速度分配,其最优解具有bang-bang特性。

郑伟强dev的专栏 322

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

贪心算法解决单源最短路径问题

贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择。贪心算法的基本要素 1. 贪心选择性质 2. 最优子结构性质

悦兮Yui的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

带权有向图单源最短路径(Dijkstra算法)

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。 假设P(i,j)={Vi.

arhaiyun的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【算法入门&搜索法】走迷宫|单源最短路径1

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!

叶落秋白的博客 3910

【算法与数据结构】Dijkstra算法求单源最短路径问题

Dijkstra算法,是用来算出图中一个顶点到其余各顶点的最短路径。适合于解决带权的有向图中的单源最短路径问题。

2401_82677021的博客 1325

单源最短路径 Dijkastra算法

给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 1、算法基本思想 Dijkstra(迪杰斯特拉)算法是解单源最短路径问题的贪心算法。 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从

天堂人间 2374
上一篇: 实用算法实现-第 19 第 最小生成树
下一篇: 实用算法实现-第 21 篇 每对顶点间的最短路径
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值