PTA L2-001 紧急救援 (点带权最短路)
<题目链接>
题目大意:
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。
第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。
解题分析:
由于本题在保证路径最短的情况下,还要使路径上的点权和最大,所以我们在最短路的松弛过程中,优先松弛路径,如果最短路径相同,再考虑挑选点券和最大的路,并且,最短路的条数也能够在Dijkstra松弛的过程中维护。
#include <bits/stdc++.h> using namespace std;const int N = 505; const int INF = 0x3f3f3f3f; #define pb push_back int n,m,st,ed; struct Edge{ int to,val; }; vector<Edge>G[N]; int path[N],vis[N],num[N];struct Node{int loc,dist,mxval,cnt;Node(int _loc=0,int _dist=0,int _mxval=0,int _cnt=0):loc(_loc),dist(_dist),mxval(_mxval),cnt(_cnt){}bool operator < (const Node &tmp)const{return dist>tmp.dist;} }node[N];void Dij(){memset(path,-1,sizeof(path));for(int i=0;i<n;i++){vis[i]=0,node[i]=Node(i,INF,0,0);}priority_queue<Node>q;node[st]=Node(st,0,num[st],1);q.push(node[st]);while(!q.empty()){int u=q.top().loc;q.pop();if(vis[u])continue;vis[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i].to,cost=G[u][i].val;if(node[v].dist>node[u].dist+cost){node[v].dist=node[u].dist+cost;path[v]=u; //记录上一个点node[v].cnt=node[u].cnt; //更新这个点的最短路条数node[v].mxval=node[u].mxval+num[v]; //记录以这个点为终点的最短路的点权和 q.push(node[v]);}else if(node[v].dist==node[u].dist+cost){ node[v].cnt+=node[u].cnt; //因为有多条最短路径,所以这里将之前的最短路径条数加起来 if(node[v].mxval<node[u].mxval+num[v]){ //更新最短路径上的点权最小值 node[v].mxval=node[u].mxval+num[v];path[v]=u;}}}} }void Print(int u){ //递归打印路径 if(u==st){printf("%d",st);return;}Print(path[u]);printf(" %d",u); }int main(){scanf("%d%d%d%d",&n,&m,&st,&ed);for(int i=0;i<n;i++)scanf("%d",&num[i]);for(int i=0;i<m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);G[u].pb(Edge{v,w});G[v].pb(Edge{u,w});}Dij();printf("%d %d\n",node[ed].cnt,node[ed].mxval);Print(ed);puts("");return 0; }
转载于:https://www.cnblogs.com/00isok/p/10575027.html
PTA L2-001 紧急救援 (点带权最短路)相关推荐
- 【PAT - 甲级 - 1018】Public Bike Management (带权最短路,多条最短路中加条件,DFS)
题干: 链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f 来源:牛客网 There is a ...
- 51Nod1459 迷宫游戏(带权最短路)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数 ...
- 【练习】树(Tree, UVa 548)给一棵点带权(权值各不相同)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。
给一棵点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小.如果有多解,该叶子本身的权应尽量小.输入中每两行表示一棵树,其中第一行为中序遍 ...
- 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
- 哈夫曼带权路径长度C语言,解决关于哈夫曼编码计算带权路径长度问题
这是在做一道编程提示遇到的,学习了一位博主的编码,其中有些问题未能理解,分析解决掉. 首先什么是哈夫曼树: 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树. 也就是根节点到节点的中的长度最小,当 ...
- 关于哈夫曼树与编码,带权路径长度
哈夫曼树 哈夫曼树与哈夫曼编码的定义 建立哈夫曼树 哈夫曼树编码 通过译码求输入的序列 具体题目与完整代码: 建哈夫曼树,求哈夫曼编码,求解译码 带权路径长度 哈夫曼树与哈夫曼编码的定义 typede ...
- 语音识别、传统语音识别、带权有限转态转换器、深度语音识别、时序分类、CTC解码
语音识别.传统语音识别.带权有限转态转换器.深度语音识别.时序分类.CTC解码 目录
- 2017乌鲁木齐区域赛I(带权并查集)
#include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...
- BZOJ 2303 方格染色(带权并查集)
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...
最新文章
- 改变你的 KDE 桌面的外观和感觉方法介绍
- STM32H7的Cache和MPU
- 那个当上非洲酋长的交大才子,如今怎么样了?
- VTK:二次曲面用法实战
- 《信息学奥赛一本通》1283:登山
- CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom
- Oracle和Mysql的区别 转载
- 小程序用php的优势,小程序的特点及优势?
- Oracle用Start with...Connect By prior子句递归查询(转)
- 关于linux目录~ / .
- html中设置圆角div,Javascript 圆角div的实现代码
- Postman设置请求cookie
- 度量python的运行时间
- c语言二维数组学习,C语言学习之二维数组的传参
- 《互联网信息资源检索与利用》读书笔记
- 英特尔处理器排名_鲁大师公布三季度PC处理器、内存排行榜:AMD成最大赢家
- Maven delopy源码
- 标注、注记、图形文本
- 2008 go server sql 批处理_Transact-SQL批处理
- tensorflow最新版本与keras版本对应