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

题解:AtCoder AT_awc0089_d Cheapest Route

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AtCoder:D - Cheapest Route

【题目描述】

Takahashi lives in a country consisting ofN NNcities. Each city is numbered from1 11toN NN, and the population of cityi iiisM i M_iMi.

There areK KKroads in this country, and roadk kkbidirectionally connects cityU k U_kUkand cityV k V_kVk. Takahashi can travel in either direction between two cities that are directly connected by a road. He may also pass through the same road or the same city multiple times.

Each time Takahashi travels from citya aato an adjacent cityb bbthat is directly connected by a road, he must pay a toll ofM a × M b M_a \times M_bMa×Mb.

Takahashi is currently in city1 11. There areP PPcities with airports in this country, which are citiesE 1 , E 2 , … , E P E_1, E_2, \dots, E_PE1,E2,,EP. Takahashi can leave the country once he reaches any city with an airport. If city1 11itself has an airport, he can leave without moving, and the total toll is0 00.

Find the minimum total toll Takahashi must pay to travel from city1 11to any city with an airport. It is guaranteed that at least one city with an airport is reachable from city1 11.

高桥住在一个有N NN个城市组成的国家。每个城市编号从1 11N NN,城市i ii的人口为M i M_iMi

这个国家有K KK条道路,道路k kk双向连接城市U k U_kUk和城市V k V_kVk。高桥可以在由道路直接连接的两个城市之间双向移动。他也可以多次经过同一条道路或同一个城市。

每次高桥从一个城市a aa移动到由道路直接连接的相邻城市b bb时,他必须支付M a × M b M_a \times M_bMa×Mb的通行费。

高桥目前在1 11号城市。这个国家有P PP个有机场的城市,分别是E 1 , E 2 , … , E P E_1, E_2, \dots, E_PE1,E2,,EP。一旦高桥到达任何一个有机场的城市,他就可以离开这个国家。如果1 11号城市本身就有机场,他可以不移动就离开,总通行费为0 00

求高桥从1 11号城市到达任意一个有机场的城市所需支付的最小总通行费。保证至少有一个有机场的城市可以从1 11号城市到达。

【输入】

N NNK KKP PP
M 1 M_1M1M 2 M_2M2… \dotsM N M_NMN
U 1 U_1U1V 1 V_1V1
U 2 U_2U2V 2 V_2V2
⋮ \vdots
U K U_KUKV K V_KVK
E 1 E_1E1E 2 E_2E2… \dotsE P E_PEP

  • The first line contains the number of citiesN NN, the number of roadsK KK, and the number of cities with airportsP PP, separated by spaces.
  • The second line contains the population of each cityM 1 , M 2 , … , M N M_1, M_2, \dots, M_NM1,M2,,MN, separated by spaces.
  • The followingK KKlines provide information about the roads.
  • The( 2 + k ) (2 + k)(2+k)-th line( 1 ≤ k ≤ K ) (1 \leq k \leq K)(1kK)contains the numbers of the two cities connected by roadk kk,U k U_kUkandV k V_kVk, separated by spaces.
  • The( K + 3 ) (K + 3)(K+3)-th line contains the numbers of the cities with airportsE 1 , E 2 , … , E P E_1, E_2, \dots, E_PE1,E2,,EP, separated by spaces.

【输出】

Print in one line the minimum total toll Takahashi must pay to travel from city1 11to any city with an airport.

【输入样例】

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

【输出样例】

7

【算法标签】

#Dijkstra

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;// 定义长整型别名,便于处理大数据#defineintlonglong// 定义pair类型别名,用于存储边权和对typedefpair<int,int>PII;// 小根堆优先队列,用于Dijkstra算法priority_queue<PII,vector<PII>,greater<PII>>pq;// 定义数组最大容量constintN=200005,M=200005;// 全局变量声明intn;// 节点数量intk;// 边的数量intp;// 目标节点数量intans=1e18;// 记录最短距离,初始化为极大值intm[N];// 每个节点的权值intdist[N];// 存储从起点到各节点的最短距离boolst[N];// 标记节点是否已确定最短距离vector<PII>h[N];// 邻接表,存储图的边信息inte[N];// 未使用的数组(保留原样)// Dijkstra求最短路算法voiddijkstra(){// 初始化标记数组和距离数组memset(st,0,sizeof(st));memset(dist,0x3f,sizeof(dist));// 起点为节点1,距离为0pq.push({0,1});dist[1]=0;// 主循环:每次取出距离最小的未确定节点while(!pq.empty()){intu=pq.top().second;// 当前节点编号intw=pq.top().first;// 当前距离pq.pop();// 如果该节点已经确定了最短距离,跳过if(st[u]==true)continue;// 标记该节点已确定最短距离st[u]=true;dist[u]=w;// 遍历当前节点的所有邻接节点for(inti=0;i<h[u].size();i++){intv=h[u][i].second;// 邻接节点编号intedge_w=h[u][i].first;// 边权// 松弛操作:如果经过u到达v的距离更短,则更新if(dist[v]>dist[u]+edge_w){dist[v]=dist[u]+edge_w;pq.push({dist[v],v});// 将新的距离加入优先队列}}}}// 主函数入口(使用signed避免与long long冲突)signedmain(){// 读取节点数量、边的数量和目标节点数量cin>>n>>k>>p;// 读取每个节点的权值for(inti=1;i<=n;i++)cin>>m[i];// 读取k条边并建图while(k--){intu,v;// 边的两个端点cin>>u>>v;intw=m[u]*m[v];// 边权为两端点权值的乘积h[u].push_back({w,v});// 添加双向边h[v].push_back({w,u});}// 运行Dijkstra算法求最短路dijkstra();// 读取p个目标节点,找出其中距离起点最近的那个for(inti=1;i<=p;i++){intx;// 目标节点编号cin>>x;ans=min(ans,dist[x]);// 更新最短距离}// 输出最短距离cout<<ans<<endl;return0;}

【运行结果】

4 4 1 2 3 1 5 1 2 1 3 2 4 3 4 4 7
http://www.gsyq.cn/news/1511483.html

相关文章:

  • 2026济南回收亲测日记:带旧金暗访多家店,奢响佳是最让人安心的一家 - 商业快讯早知道
  • 2026年10款论文AI智能降重工具亲测:从90%降至10%的靠谱之选
  • 3步实战AI视频超分辨率:用ComfyUI-WanVideoWrapper将模糊视频变高清
  • STM32F103上跑通VL53L1X激光测距,I2C软模拟+HAL驱动全配齐
  • 2026 南京黄金回收店甄选|资质合规为基石,耀辉龙头品牌筑牢变现安全底线 - 奢侈品回收
  • NXP MWCT1011/1012无线充电控制器:15W单线圈方案选型与开发实战
  • 如何在Microsoft Word中快速安装APA第7版格式模板:完整指南
  • Pegasus XL空中发射多级火箭轨迹仿真MATLAB工具(含预设极地轨道任务参数)
  • 基于QorIQ/PowerQUICC单芯片的PROFIBUS从站设计:原理、选型与实战
  • 官方备案可查!2026 广州钻石回收首选,高溢价无套路 - 薛定谔的梨花猫
  • STC8H远程升级实战:用串口IAP功能给你的设备装上“无线更新”翅膀
  • AI 推理性能调优:Tensor Parallelism 与 Pipeline Parallelism 的通信优化
  • 2026年6月亨得利官方售后服务网点实地核查报告:迁址与新开网点全汇总 - 亨得利钟表维修中心
  • BCH(192,116)纠错编解码C++工程:含可直接运行的编码器与解码器
  • NewJob:智能时间可视化技术让求职效率提升300%的浏览器插件
  • 南京亨得利靠谱修表师傅在哪里?2026年官方售后实测:劳力士/欧米茄/百达翡丽维修案例全记录 - 亨得利腕表维修中心
  • 猫抓插件:轻松掌握网页媒体资源的浏览器嗅探工具
  • 龙华出卡地亚手镯不用跑!上门回收,实时报价太良心 - 逸程
  • 2026 年 6 月昆明黄金回收标杆,价格领先全城,服务覆盖各区域 - 开心测评
  • 英雄联盟终极自动化工具:League Akari 5分钟快速上手指南
  • MC68HC16Z2嵌入式开发:SRAM、ROM与GPT模块配置实战指南
  • 2026年6月最新!亨得利全国官方售后服务中心网点地址与热线核验报告(实地走访+多方验证) - 亨得利钟表维修中心
  • 2026年6月最新|知名层流罩厂家哪家好 深耕洁净行业 经验丰富 客户口碑好 - 商业新知
  • 2026阜阳防水补漏5家品牌横向测评:厨房卫生间外墙地下室漏水修缮哪家靠谱?御邦修缮99.8分五星稳居排行榜首 - 绿呼吸检测中心
  • 贵阳GEO网络推广代运营公司怎么选?5家服务商代运营能力与交付标准对比 - 优质企业观察收录
  • 高效3分钟找回QQ号:手机号查询完整解决方案
  • 2026苏州黄金回收领先者测评:权威夺冠,高价领跑 - 奢侈品回收测评
  • Waifu2x-Extension-GUI:3步掌握AI画质增强与超分辨率放大
  • 四川房屋结构加固如何避坑 西瑞解析碳纤维粘钢裂缝修补施工选择技巧 - 品研笔录
  • 别再卡了!用大白话拆解YouTube的‘自适应码率’技术,看它如何偷偷帮你选画质