https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840

L2-001 紧急救援 (25 分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N是城市的个数,顺便假设城市的编号为0 ~ N-1;M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

题意 : 无向图 n 个点 m 条边 给定起点s和终点d 每个点都有一个点权 问从s到d有多少条最短路,所有最短路中经过的点权和最大是多少,并输出这条路径

解析:dij 最短路计数  维护一个ans[] 数组, 点权和最大维护dianquan[ ]数组 ,path[ ]数组记录前驱节点。

1.最短距离被更新 v的最短路条数就等于u的最短路条数,点权也是一样,v的最短距离变了 ,所以要入队去更新相邻的节点。

dis[u]+w<dis[v]    dis[v]=dis[u]+w , ans[v]=ans[u], dianquan[v]=dianquan[u]+val[v],  path[v]=u  (dis[v],v)入队

2.最短距离相等 说明有多条相等的路径到达v 都加起来。然后再比较那条路的点权和最大,更新点权和,路径也要更新。

最短路没变不需要入队,因为队列里已经有了,再进相同的也没意义,每个点只会用来更新相邻节点一次,进也白进。

ans[v]+=ans[u]  if(dianquan[v]<dianquan[u]+val[v]) dianquan[v]=dianquan[u]+val[v],path[v]=u;

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n")
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl
#define ffread(a) fastIO::read(a)
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
const int inf = 0x3f3f3f3f;
const ll mod = 1000000009;
const double epx = 1e-6;
const double pi = acos(-1.0);
//head------------------------------------------------------------------
typedef pair<int,int> pii;
vector<pii> g[maxn];
int val[maxn],ans[maxn],vis[maxn],dis[maxn],dianquan[maxn],path[maxn];
void dij(int s,int t)
{fillchar(vis,0);fillchar(dis,0x3f);priority_queue<pii,vector<pii>, greater<pii> > q;q.push(mp(0,s));dis[s]=0;ans[s]=1;path[s]=-1;dianquan[s]=val[s];while(!q.empty()){pii temp=q.top();q.pop();int u=temp.se;if(vis[u])continue;vis[u]=1;for(int i=0;i<g[u].size();i++){int v=g[u][i].fi;int w=g[u][i].se;if(dis[u]+w<dis[v]){ans[v]=ans[u];dianquan[v]=dianquan[u]+val[v];dis[v]=dis[u]+w;path[v]=u;q.push(mp(dis[v],v));}else if(dis[u]+w==dis[v]){ans[v]+=ans[u];if(dianquan[u]+val[v]>dianquan[v]){dianquan[v]=dianquan[u]+val[v];path[v]=u;}}}}cout<<ans[t]<<" "<<dianquan[t]<<endl;
}
void print(int t)
{stack<int> s;while(t!=-1){s.push(t);t=path[t];}while(!s.empty()){int ans=s.top();s.pop();if(s.empty())cout<<ans<<endl;elsecout<<ans<<" ";}
}
int main()
{int n,m,s,t;cin>>n>>m>>s>>t;for(int i=0;i<n;i++)cin>>val[i];for(int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;g[u].pb(mp(v,w));g[v].pb(mp(u,w));}dij(s,t);print(t);
}

 

转载于:https://www.cnblogs.com/stranger-/p/10604203.html

拼题 L2-001 紧急救援 最短路计数+记录路径相关推荐

  1. 1491. [NOI2007]社交网络【最短路计数】

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...

  2. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond(spfa+最短路计数) 题解

    题目来源: https://www.luogu.org/problemnew/show/P1606 题目描述: 题目描述 FJ has installed a beautiful pond for h ...

  3. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  4. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

  5. nssl1338-逃亡路径【最短路计数,bfs】

    正题 题目大意 n∗mn*mn∗m的格子,一个走"日"字形的马,从(1,1)(1,1)(1,1)走到(n,m)(n,m)(n,m)的最短路条数. 解题思路 模板最短路计数改一下即可 ...

  6. [图论]最短路计数(spfa)

    最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...

  7. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  8. 拼题A 7-7 计算存款利息

    拼题A 7-7 计算存款利息 (20分) 本题目要求计算存款利息,计算公式为interest=money×(1+rate) ​year ​​ −money,其中interest为存款到期时的利息(税前 ...

  9. Pintia(拼题A)刷题插件 on VS Code

    开发背景 初次在拼题A(Pintia)上刷题是在2019年的暑假,使用的首选语言是 C++,编辑器则以 VS Code 为主.VS Code 由于其免费.轻量以及插件库丰富的特性,吸引了越来越多的开发 ...

最新文章

  1. 将Node.js升级到最新版本
  2. 开源 java CMS - FreeCMS2.6 静态化管理
  3. gitlab与jenkins的自动化部署(通过webhook与ansible)
  4. Linux内核编译与管理
  5. 【转】msyql使用-用户创建/权限配置
  6. Linux下交叉编译gdb和gdbserver
  7. 转:Excel导出问题(导出时不去掉前面的0)
  8. 图论--拓扑排序--判断一个图能否被拓扑排序
  9. 文本文档TXT每行开头结尾加内容批处理代码
  10. 服务端/web+客户端模式配置
  11. java mysql 连接测试_java连接mysql数据库及测试是否连接成功的方法
  12. Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏源代码
  13. (十五)final关键字
  14. 对Runtime的理解
  15. 五种压缩软件(WinRAR、7Z、好压、快压和360压缩)之比拼
  16. 破解TexturePacker加密资源
  17. 华为c199刷android原生,华为C199刷机教程(强刷官方固件rom包)
  18. H.265中熵编码器的总结
  19. 基于属性词补全的武器装备属性抽取研究
  20. 聊天室系统测试用例设计及报告

热门文章

  1. java研发网页数据采集
  2. saveOrUpdate Transaction silently rolled back because it has been marked as rollback-only
  3. 【函数】Oracle函数系列(2)--数学函数及日期函数
  4. 人和工具的关系_为什么说制造和使用工具是人和动物的区别?那人是动物么?...
  5. Java实现 蓝桥杯 算法训练 Cowboys
  6. 女性视角有利于人工智能平衡发展
  7. u盘解写保护软件usbmon
  8. 巴西龟饲养日志----提前结束冬眠
  9. Android 应用程序未安装问题
  10. ATAx=0与Ax=0同解