最短路径问题(Dijkstar算法 HDU 1874 畅通工程续  )详解

图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂! Dijstra算法 阅读详情

HDU 1874 畅通工程续  

 

畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10327    Accepted Submission(s): 3451

 

Problem Description

某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

 

 

Input

本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

 

 

Output

对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

 

 

Sample Input

3 3

0 1 1

0 2 3

1 2 1

0 2

3 1

0 1 1

1 2

 

 

Sample Output

2

-1

2012-04-07 09:31:33|  分类: 最短路问题|举报|字号 订阅

最短路径问题(Dijkstar算法)

算法分析

和"HDU 2544 最短路"(http://qianmacao.blog.163.com/blog/static/203397180201236114656481/)完全一样,不再赘述。

详情见文章“最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现”。

代码如下:

 

 

#include<iostream>
using namespace std;
const int mmax=2000000;
int dist[200]/*表示当前点到源点的最短路径长度*/,c[200][200];// 记录图的两点间路径长度
void Dijkstar(int n,int v)
{
    bool s[200];//判断是否已存入该点到S集合中 
    int i,j;
    for(i=0;i<n;i++)
    {
        s[i]=0;  // 初始都未用过该点 
        dist[i]=c[v][i];//存入当前点 到源点的路径长 
    }
    s[v]=1;//源点存入到s集合中 
    dist[v]=0;//源点到源点的路径长为0 
    for(i=1;i<n;i++)
    {
        int temp=mmax;    //转换赋值,防止混乱 
        int u=v;
        for(j=0;j<n;j++)//遍历所有的点,找到和起点相连的点 
        {
            if(!s[j]&&dist[j]<temp)//如果j没有存在,并且j 到源点的值小于已经存在的值 
            {
                temp=dist[j];//取小的路径长 
                u=j;//起点转换 
            }
        } 
         s[u]=1;//起点存入到s集合中 
         for(j=0;j<n;j++)//遍历所有的点 ,寻找和新起点相连而且不是在已经在s集合中的点, 
         {
             if(!s[j]&&c[u][j]+dist[u]<dist[j])//如果j没有存入到s的集合中,并且查找当前点到起始点的最小路径 
             {
                 dist[j]=dist[u]+c[u][j];//取更小的路径长 
             }
         }
    }
}
int main()
{
    int n,m,s,t;
    int a,b,x,i,j;
    while(cin>>n>>m)
    {
        for(i=0;i<n;i++)//初始赋值,把所有的端点都赋值 
        {
            for(j=0;j<n;j++)
               if(i==j)
                  c[i][j]=0;//本身到本身距离为零 
                else
                  c[i][j]=mmax;//其余的全部设置为最大值,方便后面判断,更改 
        }
        for(i=0;i<m;i++)//读入已经有路的信息,权值、端点 
        {
            cin>>a>>b>>x;//读入两个端点,以及两个端点的距离 
            if(x<c[a][b])//有重边,也就是判断是否有相同的路径,如果有相同的,取最小的路径替换已有的路径长 
            {
                c[a][b]=c[b][a]=x;
            }
        }
            for(i=0;i<n;i++)//初始当前点到源点的最短路径长度 
            {
                dist[i]=mmax;//全部设置为最大值 
             } 
            cin>>s>>t;//读入源点和终结点 
            Dijkstar(n,s);//调用算法 ,将端点个数和源点输入到所调用的函数中 
            if(dist[t]==mmax)//如果还是没有路径的话, 
               cout<<"-1"<<endl;//输出1 
            else 
               cout<<dist[t]<<endl;//如果有的话,输出最短路径长度 
        }
        return 0;
}


 

 

 

最短路径问题---Dijkstra算法详解 前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. Name:Willam Time:2017/3/8 1、最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法:... 阅读详情

相关推荐

Dijkstra算法(迪杰斯特拉算法)详解

Dijkstra算法(迪杰斯特拉算法)可以在给定网(带权图)中查找一个顶点到其它顶点的最短路径,算法的时间复杂度为O(n2)。如果需要查找网中任意两个顶点之间的最短路径,虽然Dijkstra算法也能解决(对每个顶点都执行一次Dijkstra算法),但更建议使用Floyd弗洛伊德算法。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。

数据结构和算法教程(C语言版) 3386

狄克斯特拉(Dijkstra)算法详解

最近在看《算法图解》,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了。后续在查阅诸多资料之后,总结文章一篇,尽可能以通俗易懂且思路清晰的方式来讲解狄克斯特拉算法。...

Wopelo的博客 4万+

从论文到生产:iSLIP优先级匹配算法在SDN交换机中的20年演进史

本文回顾了iSLIP优先级匹配算法在SDN交换机中的20年演进历程,从斯坦福大学的原始论文到现代芯片实现。通过独特的指针滑动和迭代循环机制,iSLIP算法显著提升了交换机的吞吐量和公平性,解决了传统FIFO调度的队头阻塞问题。文章详细探讨了算法在硬件实现中的工程挑战、开源实践及未来AI时代的智能调度方向。

weixin_29230649的博客 331

Dijkstra算法图文详解

Dijkstra算法 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。 问题引入: 指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中...

black_hole6的博客 37万+

从配置文件加载顺序揭秘:为什么你的logback.xml读不到application.yml?

本文深入解析了Spring Boot中logback.xml无法读取application.yml配置的原因,揭示了Spring Boot配置加载机制与日志系统初始化的时序问题。通过对比logback.xml与logback-spring.xml的差异,提供了使用springProperty标签和系统属性传递等解决方案,帮助开发者有效解决日志配置问题。

weixin_29214335的博客 364

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

迪杰斯特拉(Dijkstra)算法

一 算法介绍 迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。它是一个贪心算法。 二 核心思想 1. 选定一个点,这个点满足两个条件:1.未被选过,2.距离最短 2. 对于这个点的所有邻近点去尝试松弛 三 算法步骤 首先,可以设置两个集合分别是A和B,A用来存放已经求出最短路径的点,B用来存放还未计算出最短路径的点,接下来就可以开始做题啦!!! 我们从图中任选一点来解题,假设我们将源点source选择..

xiaoxi_hahaha的博客 12万+

告别串口助手!手把手教你用Matlab直接读取STM32的传感器数据(附完整代码)

本文详细介绍了如何利用Matlab直接与STM32进行串口通信,实现传感器数据的实时采集与分析。通过完整的代码示例和系统架构设计,帮助开发者告别传统的串口助手工具链,打造高效、自动化的数据采集系统。文章涵盖了从硬件配置、通信协议设计到Matlab数据处理与可视化的全流程,特别适合嵌入式开发与数据分析结合的实践场景。

weixin_42629671的博客 430

图论——最短路径_Dijkstar——hdu 1874畅通工程续

畅通工程续Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 63386    Accepted Submission(s): 23831Problem Description某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也...

qq_36914923的博客 197

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7818

【100%通过率】华为od机试C卷【小朋友来自多少小区】JS 实现

幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个.我们将这些数量汇总到数组 garden 中。请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区?

MISAYAONE的博客 2007

【图论】最短路算法 spfa&dijkstra+配对堆优化 hdu1874

目录 1.spfa(Shortest Path Faster Algorithm): 2.dijkstra+配对堆优化: 1.spfa(Shortest Path Faster Algorithm): 可以处理负边但不能处理负环,时间复杂度为O(kN)k为所有顶点进入队列的平均数,N为顶点个数。 算法思想:源点为s,s到i的当前最短路径为d[i],初始时,s到每个点的d[i]都为...

weixin_43719720的博客 549

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1461

图解迪杰斯特拉(Dijkstra)最短路径算法

【干货满满!】在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。而最短路径这个词不用过多解释,就是其字面意思:在图中,对于非带权无向图而言,从源点到终点边最少的路径(也就是BFS广度优先的方法);而对于带权图而言,从源点到终点权值之和最少的路径叫最短路径;最短路径应用:道路规划;我们最关心的就是去实现寻找最短路径,通过实现.

ZER00000001的博客 7万+

56、宇宙微波背景辐射(CMB)望远镜及光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统,重点介绍了交叉德拉贡系统的结构特点、偏振测量误差及其控制、以及大型地面望远镜如ACT和SPT的设计与对比。同时,总结了不同光学系统和探测器阵列的优劣势,并展望了未来发展方向,旨在为CMB研究提供更高效的工具和技术支持。

f9g0h的博客 243

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最短路径Dijkstar算法和Floyd算法详解(c语言版)

用这两个算法做了半年多的题了,刚开始学的时候以为很懂了,直到今天数据结构课上,我才真正的明白了,下面我来详解这两个算法。 先说说Dijkstra吧,这种算法只能求单源最短路径,那么什么是单源最短路径呢?就是只能求一个点到别的点最短路径,而不能求所有点到其它点的最短路径。当然如果枚举所有点都用一遍Dijkstra的话,也能求出来,不过这就失去了这个算法的真正意义,而且时间复杂度会从O(n^2)变为

代码改变世界,keep coding。 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Dijkstra 最短路径算法

Dijkstra 算法由荷兰计算机科学家于 1956 年提出,主要用于在加权图(无负权边)中寻找从源点到所有节点的最短路径。采用贪心策略,每次选取当前已知的最短路径节点,更新其邻居节点的最短路径。使用优先队列来优化节点选择,使时间复杂度降低。非负权重图(无法处理负权重)。稠密或稀疏图(可用不同数据结构优化)。Dijkstra 是解决单源最短路径问题的高效算法,广泛应用于导航、网络、交通、AI 寻路等领域。虽然 Dijkstra 不能处理负权图,但其可优化的特性使其成为路径规划的首选方案之一。

宋发元 1800

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Dijkstra算法——从原理到实现

Dijkstra 算法是由荷兰计算机科学家 Edsger W. Dijkstra 在 1956 年提出的一种解决带权有向图中单个源点到所有其他节点最短路径问题的算法。该算法要求图中所有边的权值非负,其时间复杂度在使用优先队列优化后可以达到 O ((V+E) logV),其中 V 是节点数,E 是边数。 本文将详细介绍 Dijkstra 算法的原理、实现以及应用场景,并给出 Python、Java 和 C++ 三种语言的实现代码。

2305

Dijkstra算法(附代码理解)

在每一步中,算法都会选择一个尚未被访问的顶点,该顶点到源点的距离是已知的最短路径长度,然后更新与其直接相连的未被访问顶点的最短路径估计值.与其他算法结合:在需要处理大规模图或有特殊需求的场景下,可以考虑将Dijkstra算法与其他算法结合使用,例如A*搜索算法,通过引入启发式信息来提高效率。遍历当前顶点的所有邻接顶点,计算经过当前顶点到达邻接顶点的距离,如果该距离小于邻接顶点当前的最短路径估计值,则更新该估计值。图的稠密度:在稀疏图中,算法性能较好,因为邻接列表的使用减少了不必要的访问。

LIUMAO99的博客 2908

迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

迪杰斯特拉迪杰斯特拉算法分析朴素版迪杰斯特拉迪杰斯特拉堆优化(邻接表存图)迪杰斯特拉堆优化(链式前向星存图)最短路——spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存图,即邻接矩阵,邻接表,链式前向星 1.邻接矩阵 用二维数组储存即可int graph[maxn][maxn];, graph[i][j]储存结点i到j边的权值 优点 适合稠密图,编码非常简短,对边的存储,查询,更新等操作又快又简单,只需要一步就能访问和修改。 缺点 存储复杂度O(V^2)太高 一般情况下不能存储重边 2

少年白马 4746

简单易懂——Dijkstra算法讲解

赋权有向图或者无向图。

Machine Learning with Tutors 11万+

Dijkstra算法详解(完美图解、趣学算法)

Dijkstra算法详解Dijkstra算法设计Dijkstra算法简介Dijkstra算法的基本思想Dijkstra贪心策略完美图解伪代码详解完整代码算法解析及优化拓展使用优先队列的完整代码相关题的题解写在最后的话 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法是解决**单源最短路径**问题的**贪心算法** 它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径 直到求出从源点到其他各个顶点的最短路径。 Dijkstra算法的基本思想 首先假定源点为u,顶点集合

qq_45776662的博客 12万+

最短路径——Dijkstar算法

背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的。该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解。 Dijkstar算法理解: Dijkstar算法的核心思想就是通过一次一次的迭代,逐个寻找起始顶点到图中每一个顶点的最短路径,并在确定一个顶点的最短路径之后,设置标志位,同时根据最新确定的顶点的最短路径,对其他与之相关顶点的最短路径进行修正和更新。 ...

qq_40464014的博客 1197

最短路径之Dijkstar算法详解

最短路径之Dijkstar算法详解

Neo的战斗部 578

dijkstra算法详解—简单易懂

dijkstra算法详解(迪杰斯特拉算法)~~简单易懂,代码附有详细注释,含动态演示图片

pursuit的博客 43万+
上一篇: HDU 1874-畅通工程续
下一篇: Spfa模板(使用邻接表和队列实现)
Strive_Y
博客等级 码龄8年 53粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值