浙大数据结构:07-图6 旅游规划

news2024/10/8 22:15:14
这道题用Dijkstra算法即可解决。

1、条件准备

n、m、s、d,其中 n(2≤n≤500)是城市的个数,m 是高速公路的条数;s 是出发地的城市编号;d 是目的地的城市编号

path数组存两点之间距离,value数组存两点之间费用

visit数组存是否访问过该结点,minvalue数组存到该点的费用(不一定最小,路径同长才取最小)

  #include <iostream>
  #include<vector>
  #include<string.h>
  #include <climits>
  using namespace std;
  #define endl '\n'

int n,m,s,d;
int path[505][505];
int value[505][505];
int visit[505];
int minvalue[505];

2、主函数

初始化path为-1,表示没有路径。然后输入数据,存到path数组、value数组中

然后Dijkstra一下

 int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
   memset(path,-1,sizeof(path));
    cin>>n>>m>>s>>d;
   for(int i=0;i<m;i++)
   {
    int a,b,p,v;
    cin>>a>>b>>p>>v;
    path[a][b]=path[b][a]=p;
    value[a][b]=value[b][a]=v;
   }

  Dijkstra();
    return 0;
  }

3、Dijkstra

mindist数组是存到该点的最短距离的,初始s距离为0

然后遍历n遍,保证每个点都visit,minval存未访问的结点到s的最短距离,cur存是哪个结点。

第一重for循环能找到上述索要的,标记最短为1,再访问每个结点,看看从这个点到该节点的距离是否比mindist小,小的话更新mindist和minvalue

注意如果距离相等时,要比较minvalue,并更新minvalue

最后输出终点的mindist和minvalue

void Dijkstra()
{
 vector<int> mindist(n+5,INT_MAX);

 mindist[s]=0;
 for(int i=0;i<n;i++)
 {
  int minval=INT_MAX;
  int cur=-1;
  for(int v=0;v<n;v++)
  if(!visit[v]&&mindist[v]<minval)
     {
      minval=mindist[v];
      cur=v;
     }
    visit[cur]=1;
    for(int v=0;v<n;v++)
    { if(!visit[v]&&path[cur][v]>=0&&mindist[cur]+path[cur][v]<=mindist[v])
        { 
          if(mindist[cur]+path[cur][v]==mindist[v])
          { if(minvalue[cur]+value[cur][v]<minvalue[v])
            minvalue[v]=minvalue[cur]+value[cur][v];
          }
          else  {mindist[v]=mindist[cur]+path[cur][v];
           minvalue[v]=minvalue[cur]+value[cur][v];}
        }
    }
 }
 cout<<mindist[d]<<' '<<minvalue[d];
}

4、总结

这道题并不难,第一次写dijkstra也用不了多长时间就能写出来。

完整代码如下:

  #include <iostream>
  #include<vector>
  #include<string.h>
  #include <climits>
  using namespace std;
  #define endl '\n'

int n,m,s,d;
int path[505][505];
int value[505][505];
int visit[505];
int minvalue[505];

void Dijkstra()
{
 vector<int> mindist(n+5,INT_MAX);

 mindist[s]=0;
 for(int i=0;i<n;i++)
 {
  int minval=INT_MAX;
  int cur=-1;
  for(int v=0;v<n;v++)
  if(!visit[v]&&mindist[v]<minval)
     {
      minval=mindist[v];
      cur=v;
     }
    visit[cur]=1;
    for(int v=0;v<n;v++)
    { if(!visit[v]&&path[cur][v]>=0&&mindist[cur]+path[cur][v]<=mindist[v])
        { 
          if(mindist[cur]+path[cur][v]==mindist[v])
          { if(minvalue[cur]+value[cur][v]<minvalue[v])
            minvalue[v]=minvalue[cur]+value[cur][v];
          }
          else  {mindist[v]=mindist[cur]+path[cur][v];
           minvalue[v]=minvalue[cur]+value[cur][v];}
        }
    }
 }
 cout<<mindist[d]<<' '<<minvalue[d];
}
  int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
   memset(path,-1,sizeof(path));
    cin>>n>>m>>s>>d;
   for(int i=0;i<m;i++)
   {
    int a,b,p,v;
    cin>>a>>b>>p>>v;
    path[a][b]=path[b][a]=p;
    value[a][b]=value[b][a]=v;
   }

  Dijkstra();
    return 0;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10到16bit、内置参考振荡器 R/D转换器-MS5910PA

MS5910PA 是一款可配置 10bit 到 16bit 分辨率的旋 变数字转换器。片上集成正弦波激励电路&#xff0c;正弦和余弦 允许输入峰峰值幅度为 2.3V 到 4.0V &#xff0c;频率范围为 2kHz 至 20kHz 。 转换器可并行或串行输出角度和速度对应的 数字量。 MS5910PA 采…

银河麒麟V10安装ToDesk远程控制

银河麒麟V10安装ToDesk远程控制 ARM版本安装 1.下载arm的deb包 wget https://dl.todesk.com/linux/todesk_4.0.3_aarch64.deb2.安装 sudo apt-get install ./todesk_4.0.3_aarch64.deb3.启动todesk todesk

PCI支付卡产业第三方服务供应商TPSP的管理与实践

1.引言 在这个互联网技术日新月异的时代&#xff0c;云服务的普及让机构&#xff08;实体&#xff09;越来越倾向于借助第三方服务提供商来实现核心业务流程的外包&#xff0c;比如基础设施即服务&#xff08;IaaS: Infrastructure as a Service&#xff09;、平台即服务&…

【C语言】指针和数组的内存使用详解

目录 一、sizeof操作符 二、一维数组的练习 三、字符数组的练习 四、字符串数组 五、指针指向字符串 六、二维数组 一、sizeof操作符 在深入学习指针和数组的内存使用详情前&#xff0c;我们需要深入了解一下sizeof操作符的使用 1.1 sizeof操作符是计算括号内最终结果的…

python中zip()与zip(*)的用法解析

zip在英文中有拉链的意思&#xff0c;我们由此可以形象的理解它的作用&#xff1a;将可迭代的对象作为参数&#xff0c;将对象中对应的元素打包成一个个元组&#xff0c;然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致&#xff0c;则返回列表长度与最短的对象相…

Sharding-JDBC笔记04-分库分表实战

文章目录 前言一、需求描述二、数据库设计三、环境说明四、环境准备4.1.mysql主从同步(windows)4.2.初始化数据库 五、实现步骤5.1 搭建maven工程引入maven依赖 5.2 实体类5.3 dao层5.4 服务类5.5 测试类总结 5.6 查询商品DaoService单元测试输出小结 5.7 统计商品Dao单元测试统…

力扣 中等 46.全排列

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {List<List<Integer>> res new ArrayList<>();// 存放符合条件结果的集合List<Integer> path new ArrayList<>();// 用来存放符合条件结果boolean[] used; // 标记…

计算机毕业设计 基于Django的在线考试系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

[SAP ABAP] INCLUDE程序创建

在ABAP中&#xff0c;INCLUDE是一种结构化编程技术&#xff0c;它允许将一段程序代码片段包含到其他程序段中&#xff0c;以便复用和维护 INCLUDE程序创建的好处 ① 代码模块化 将常用的功能或通用的子程序存放到单独的文件中&#xff0c;使得主程序更简洁、易于理解和管理 ② …

一个为分布式环境设计的任务调度与重试平台,高灵活高效率,系统安全便捷,分布式重试杀器!(附源码)

背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天&#xff0c;我们经常需要对某个数据请求进行多次尝试。然而&#xff0c;当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时&#xff0c;请求…

YOLO11改进|注意力机制篇|引入MSCA注意力机制

目录 一、【MSCA】注意力机制1.1【MSCA】注意力介绍1.2【MSCA】核心代码 二、添加【MSCA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【MSCA】注意力机制 1.1【MSCA】注意力介绍 下图是【MSCA】的结构图&#xff0c;让我…

硬件SPI解析-基于江科大的源码

一、SPI基本介绍 SPI&#xff08;Serial Peripheral Interface&#xff09;通信协议是由摩托罗拉公司&#xff08;现为NXP Semiconductors的一部分&#xff09;在20世纪80年代中期开发的。SPI是一种同步串行通信接口&#xff0c;设计用于短距离通信&#xff0c;特别是嵌入式系统…

图片怎么转换成pdf格式?这5种转换方法一看就会

在工作学习中&#xff0c;PDF格式因其跨平台兼容性和安全性成为了工作和学习中不可或缺的文件格式。然而&#xff0c;很多时候我们需要将图片转换为PDF&#xff0c;以便更好地整理、分享和保存。今天&#xff0c;就为大家介绍5种高效的图片转PDF方法&#xff0c;一起来学习下吧…

让机器来洞察他的内心!

本文所涉及所有资源均在传知代码平台可获取。 目录 洞察你的内心&#xff1a;你真的这么认为吗&#xff1f; 一、研究背景 二、模型结构和代码 D. 不一致性学习网络 E. 多模态讽刺分类 三、数据集介绍 四、性能展示 五、实现过程 1. 下载预训练的 GloVe 词向量&#xff08;Comm…

端口被占用问题的解决方案

一、问题描述 如图&#xff0c;启动服务失败&#xff0c;失败原因是8080端口被占用 二、解决方案 1.更换端口为其它&#xff0c;例如8002 9001等 2.关闭占用端口的进程&#xff0c;推荐这种解决方案 步骤一&#xff1a;在win命令行查询占用该端口号的进程 命令如下 netsta…

使用浏览器这么多年,你真的了解DevTools吗?

Devtools是Web测试时每天都要用的工具&#xff0c;它提供了很多调试功能&#xff0c;可以帮助我们更好的定位问题。而我们平时使用的功能只是它全部功能的子集&#xff0c;很多功能并没用到过。 作为高频使用的工具&#xff0c;还是有必要好好掌握的。测试时在日常工作中提BUG…

项目前置知识

目录 std::bind 定时器 timerfd 时间轮设计 C11正则库 日志打印宏 通用类型ANY std::bind std::bind是C11提供的一个接口&#xff0c;他的功能&#xff1a;传递一个原始函数对象&#xff0c;对其绑定某些参数&#xff0c;生成一个新的函数对象。 其实简单来说&#xff…

YOLO--前置基础词-学习总结(上)

RFBNet是什么意思 RFBNet 是一种用于目标检测的深度学习网络&#xff0c;它的名字来源于 "Receptive Field Block Network"&#xff08;感受野块网络&#xff09;。简单来说&#xff0c;RFBNet 是一种可以让计算机更好地“看”图像中不同大小的物体的方法。 在图像处…

混凝土裂缝检测分割系统源码&数据集分享

混凝土裂缝检测分割系统源码&#xff06;数据集分享 [yolov8-seg-RCSOSA&#xff06;yolov8-seg-C2f-REPVGGOREPA等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

时间序列+Transformer席卷而来,性能秒杀传统,创新性拉满,引爆顶会!

时间序列分析与Transformer模型的结合&#xff0c;已成为深度学习领域的一大趋势。这种结合能够高效捕捉序列中的长期依赖关系&#xff0c;提升时间序列分析和预测的准确性。 时间序列Transformer技术在股票价格预测、气候预测、交通流量预测、设备故障预测、自然语言处理等多…