当前位置: 首页 > news >正文

第十三届蓝桥杯C++B组国赛E题——出差 (AC)

CSDN话题挑战赛第2期
参赛话题:算法题解

1.出差

1.问题描述

A \mathrm{A} A 国有 N N N 个城市, 编号为 1 … N 1 \ldots N 1N 。小明是编号为 1 的城市中一家公司的员 工, 今天突然接到了上级通知需要去编号为 N N N 的城市出差。

由于疫情原因, 很多直达的交通方式暂时关闭, 小明无法乘坐飞机直接从 城市 1 到达城市 N N N, 需要通过其他城市进行陆路交通中转。小明通过交通信息 网, 查询到了 M M M 条城市之间仍然还开通的路线信息以及每一条路线需要花费的 时间。

同样由于疫情原因, 小明到达一个城市后需要隔离观察一段时间才能离开 该城市前往其他城市。通过网络, 小明也查询到了各个城市的隔离信息。(由于 小明之前在城市 1 , 因此可以直接离开城市 1 , 不需要隔离)

由于上级要求, 小明希望能够尽快赶到城市 N \mathrm{N} N, 因此他求助于你, 希望你 能帮他规划一条路线, 能够在最短时间内到达城市 N N N

2.输入格式

第 1 行: 两个正整数 N , M N, M N,M 表示 A 国的城市数量, M M M 表示末关闭的路线数量

第 2 行: N N N 个正整数, 第 i i i 个整数 C i C_{i} Ci表示到达编号为 i {i} i 的城市后需要隔离的时间

3 … M + 2 3 \ldots M+2 3M+2 行: 每行 3 个正整数, u , v , c u, v, c u,v,c 表示有一条城市 u u u 到城市 v v v 的 双向路线仍然开通着, 通过该路线的时间为 c c c

3.输出格式

第 1 行: 1 个正整数, 表示小明从城市 1 出发到达城市 N N N 的最短时间(到达城市 N N N, 不需要计算城市 N N N 的隔离时间)

4.样例输入

4 4
5 7 3 4
1 2 4
1 3 5
2 4 3
3 4 5

5.样例输出

13

6.样例说明

在这里插入图片描述

7.数据范围

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1000 , 1 ≤ M ≤ 10000 , 1 ≤ C i ≤ 200 , 1 ≤ u , v ≤ N , 1 ≤ c ≤ 1000 1 \leq N \leq 1000,1 \leq M \leq 10000,1 \leq C_{i} \leq 200,1≤u,v≤ N, 1 \leq c \leq 1000 1N1000,1M10000,1Ci200,1u,vN,1c1000

8.原题链接

出差

2.解题思路

  题意很明显考察的是一个最短路径问题,虽然题目说了给定的是双向边,但是假设g[i]的含义是到达i城市需要隔离的时间。假设有城市A和城市B,且两城市存在一条权值为w的双向边,当我们从A去到B所需要花费的时间应该是w+g[B],当我们从B去到A所花的时间应该是w+g[A]。所以虽然题意是双向边,但是方向不同的情况下,权值并不一定相同,所以我们应该看成两条边。

也就是说,存在邻接矩阵gra[][]gra[i][j]表示从ij的所需要的时间,g[i][j]g[j][i]并不一定是相等的。所以我们在建图时应该分清楚,需要注意的是终点n的隔离时间我们是不考虑的,所以我们要把它置为0。然后建图完毕后直接跑一遍最短路算法即可,由于 n n n的最大只有1000,所以使用朴素dijkstra算法也是能过的。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

3.模板代码

#include<bits/stdc++.h>
using namespace std;
const int N=1010;

//邻接矩阵
int gra[N][N];
int dist[N];
int g[N];
bool st[N];
int n,m;
//朴素版dijkstra
int dijkstra()
{
	 memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    for (int i = 0; i < n - 1; i ++ )
    {
        int t = -1;
        for (int j = 1; j <= n; j ++ )
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
        for (int j = 1; j <= n; j ++ )
            dist[j] = min(dist[j], dist[t] + gra[t][j]);
        st[t] = true;
    }
	return dist[n];
}
int main() 
{
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>g[i];
	g[n]=0;
	memset(gra, 0x3f, sizeof gra);
	for(int i=1;i<=m;++i){
		int u,v,c;
		cin>>u>>v>>c;
		gra[u][v]=g[v]+c;
		gra[v][u]=g[u]+c;
	}
	cout<<dijkstra()<<endl;
    return 0;
}

相关文章:

  • 【大数据ETL工具,Kettle的学习和使用】
  • C++----二叉树的进阶
  • java基于微信小程序的智能停车场管理系统+ssm+uinapp+Mysql+计算机毕业设计
  • 学会这个样生成性能测试报告,拿下20k轻轻松松
  • 爬取小说章节,并制作成词云进行宣传
  • [架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程
  • C++内存管理以及模板的引入
  • ROS问题:gazebo没有想要的模型,而且不报错
  • 【SpringBoot+MyBatisPlus】点餐系统之登录功能、退出功能设计
  • 操作符(operator)
  • 数据同步工具—Sqoop
  • 文件上传之中间件解析漏洞详解
  • 【每日一好题】这么经典的题你不能不会:矩阵置零
  • JSR223常用函数和对象--Jmeter内置对象Chapter1
  • 从头开始训练神经网络(Unet)
  • angular2 简述
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Map集合、散列表、红黑树介绍
  • Mithril.js 入门介绍
  • MySQL的数据类型
  • python 装饰器(一)
  • rc-form之最单纯情况
  • VuePress 静态网站生成
  • vue-router 实现分析
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 将回调地狱按在地上摩擦的Promise
  • 容器服务kubernetes弹性伸缩高级用法
  • 山寨一个 Promise
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​香农与信息论三大定律
  • $(selector).each()和$.each()的区别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (原)Matlab的svmtrain和svmclassify
  • (转)jQuery 基础
  • *上位机的定义
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net程序集学习心得
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [20170705]diff比较执行结果的内容.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android 13]Input系列--获取触摸窗口
  • [CQOI 2010]扑克牌
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [ffmpeg] aac 音频编码
  • [json]定义、读写
  • [linux] GFLOPS和TFLOPS的换算
  • [na]wireshark抓包排错-tcp.flags.reset
  • [office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
  • [Qualcomm][GPIO]高通芯片引脚相关知识记录
  • [Spring]一文明白IOC容器和思想