L2-001 紧急救援(最短路)
题目链接
https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840
视频讲解
https://www.bilibili.com/video/BV1Br4y1W7Ay
思路
我们只需要在跑迪杰斯特拉最短路的时候注意一下松弛操作即可,我们定义 dis[i]dis[i]dis[i] 表示从起点 sss 到 iii 点的最短路径,sum[i]sum[i]sum[i] 表示从 sss 点到 iii 点的最多的救援队数量,cnt[i]cnt[i]cnt[i] 表示从 sss 点到 iii 点的最短路的条数,pre[i]pre[i]pre[i] 表示在最优路径下 iii 点的上一个点的位置
- 如果
dis[v] > dis[u] + w
,那么我们就要更新 dis[v]=dis[u]+wdis[v] = dis[u] + wdis[v]=dis[u]+w ,sum[v]=sum[u]+a[v]sum[v] = sum[u] + a[v]sum[v]=sum[u]+a[v],cnt[v]=cnt[u]cnt[v] = cnt[u]cnt[v]=cnt[u] ,pre[v]=upre[v] = upre[v]=u,并且将v点放入队列 - 如果
dis[v] == dis[u] + w
,那么我们就要更新 cnt[v]+=cnt[u]cnt[v] += cnt[u]cnt[v]+=cnt[u] ,因为我们可以从另外一个地方走到 vvv ,如果 sum[u]+a[v]>sum[v]sum[u] + a[v] > sum[v]sum[u]+a[v]>sum[v] 那么我们就要更新 sum[v]=sum[u]+a[v]sum[v] = sum[u] + a[v]sum[v]=sum[u]+a[v] 且更新 vvv 点的上一个节点为 pre[v]=upre[v] = upre[v]=u (因为我们要选择最优路径)
代码
#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------struct Node{int v,w;
};int t,n,m,s,d,q,a[N];
bool vis[N];
vector<Node> E[N];
int dis[N],sum[N],cnt[N],pre[N];void DJ(){priority_queue<PII,vector<PII>,greater<PII> > que;memset(dis,0x3f,sizeof dis);memset(pre,-1,sizeof pre);que.push({0,s});dis[s] = 0;cnt[s] = 1;sum[s] = a[s];while(!que.empty()){int u = que.top().second;que.pop();if(vis[u]) continue;vis[u] = true;for(int i = 0,l = E[u].size();i < l; ++i) {int v = E[u][i].v,w = E[u][i].w;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;sum[v] = sum[u] + a[v];cnt[v] = cnt[u]; pre[v] = u;que.push({dis[v],v});} else if(dis[v] == dis[u] + w){cnt[v] += cnt[u];if(sum[u] + a[v] > sum[v]) {sum[v] = sum[u] + a[v];pre[v] = u;}} }}
}void print(int p){stack<int> S;while(p != -1) {S.push(p);p = pre[p];}while(S.size() != 1){cout<<S.top()-1<<" ";S.pop();}if(S.size()) {cout<<S.top()-1<<endl;S.pop();}}void slove(){cin>>n>>m>>s>>d;s++,d++;for(int i = 1;i <= n; ++i) cin>>a[i];int u,v,w;for(int i = 0;i < m; ++i){cin>>u>>v>>w;u++,v++;E[u].push_back({v,w});E[v].push_back({u,w});}DJ();cout<<cnt[d]<<" "<<sum[d]<<endl;print(d);
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--){slove();}return 0;
}
L2-001 紧急救援(最短路)相关推荐
- 拼题 L2-001 紧急救援 最短路计数+记录路径
https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 L2-001 紧急救援 (25 分) 作为一 ...
- PTA 【L2】紧急救援
详解代码,反正是Dijkstra的应用,问题很多 当时蚌埠住了 //#pragma GCC optimize(3, "Ofast", "inline") #in ...
- 天体赛练习集 简要题解 - L2
目录 001 - 紧急救援 002 - 链表去重 003 - 月饼 004 - 这是二叉搜索树吗? 005 - 集合相似度 006 - 树的遍历 007 - 家庭房产 008 - 最长对称子串 009 ...
- 团队程序设计天梯赛考点内容总结(15分以上题)
L1: L1-002 打印沙漏 (20 分) 字符模拟 L1-003 个位数统计 (15 分) 字符模拟 L1-005 考试座位号 (15 分) 模拟 L1-006 连续因子 (20 分) 数学因数分 ...
- 一文读懂——全局注意力机制(global attention)详解与代码实现
废话不多说,直接先上全局注意力机制的模型结构图. 如何通过Global Attention获得每个单词的上下文向量,从而获得子句向量呢?如下几步: 代码如下所示: x = Embedding(inpu ...
- 团体程序设计天梯赛-练习集 (L2-001 - L2-020)
L2-001 紧急救援 最短路+路径打印 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- 计算机作业ppt怎么做,《苏腾计算机作业》PPT课件.ppt
<苏腾计算机作业>PPT课件.ppt (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 09级物理学本科班作者:苏 腾 内容 ...
- 中正平和的机器人学笔记——4. 雅可比矩阵(附MTALB代码)
1. 基础知识 基础知识主要是希望大家回顾一下大学物理里讲的速度矢量和角速度矢量部分的知识,用矢量形式去表示,还有叉乘的相关知识,这些我就不赘述了. 想象存在坐标系{A}和{B},把{B}固连在某一刚 ...
- 天梯赛最短路专题 -- 旅游规划、城市间紧急救援
最短路 7-2 旅游规划 (25分) 7-4 城市间紧急救援 (25分) 7-2 旅游规划 (25分) https://pintia.cn/problem-sets/13053317694120222 ...
- PTA L2-001 紧急救援 (点带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
最新文章
- 报错解决: error: this use of defined may not be portable
- MySQL主从复制从机验证报错:ERROR 3021(HY000):this operation cannot be performed with a
- BASIC-10 十进制转十六进制
- oracle--导出、导入blob类型的字段
- 五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解
- Odoo10教程---模块化二:模型间关系,继承,计算字段等
- OSChina 周日乱弹 ——不穿泳衣,我都不好意思上厕所
- ssh无密码登录设置方法以及出现问题 ECDSA host key 和IP地址对应的key不同的解决...
- 安徽大学江淮学院计算机作业,安徽大学江淮学院
- 计算机磁盘无法创建文件夹,无法创建文件,小编告诉你无法新建文件夹怎么办...
- Windows10性能优化设置
- 如何解决网页显示不全和打不开的问题
- Nested transactions are not supported TransactionScope 多线程事务
- HDOJ 5296 Annoying problem
- OpenStack必备基础知识
- java候选码计算的替换法_候选码求解方法
- catti二级笔译综合能力真题_CATTI英语二级笔译综合能力试卷
- LVGL|lvgl教程之修改lvgl tabview部件顶部框(选项卡)的默认样式
- Dell PowerEdge™ R510 Servers 安装 Ubuntu Server 10.04 LTS 笔记
- php计算两个坐标(经度,纬度)之间距离