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+;
const int inf = 0x3f3f3f3f;
const ll mod = ;
const double epx = 1e-;
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,);
fillchar(dis,0x3f);
priority_queue<pii,vector<pii>, greater<pii> > q;
q.push(mp(,s));
dis[s]=;
ans[s]=;
path[s]=-;
dianquan[s]=val[s];
while(!q.empty())
{
pii temp=q.top();q.pop();
int u=temp.se;
if(vis[u])
continue;
vis[u]=;
for(int i=;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!=-)
{
s.push(t);
t=path[t];
}
while(!s.empty())
{
int ans=s.top();
s.pop();
if(s.empty())
cout<<ans<<endl;
else
cout<<ans<<" ";
}
}
int main()
{
int n,m,s,t;
cin>>n>>m>>s>>t;
for(int i=;i<n;i++)
cin>>val[i];
for(int i=;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);
}
 

拼题 L2-001 紧急救援 最短路计数+记录路径的更多相关文章

  1. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  2. 天梯 L2 紧急救援 (dijkstra变形+记录路径)

    L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...

  3. HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】

    <题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...

  4. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  5. P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  6. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  7. BZOJ1632: [Usaco2007 Feb]Lilypad Pond SPFA+最短路计数

    Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...

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

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

  9. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

随机推荐

  1. 如何用纯 CSS 创作一个过山车 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KBxYZg/ 可交互视频 此视频是 ...

  2. 有关Kali更新问题的解决方法。

    近期更新源遭遇诸多不顺,无非是各种依赖问题的报错夹杂着各种稀奇古怪的问题,不过既然是玩Linux,就要做好处理各种疑难杂症的准备.经过了这几天的不断尝试,今天终于解决了更新出错的问题. 本人更新源出现 ...

  3. R-codes-tips

    1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2.  载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...

  4. how to setting a i2c driver

    How to instantiate I2C devices============================== Unlike PCI or USB devices, I2C devices ...

  5. hdu4489 组合公式+dp

    这里对于题意在说明一下, 题目中要求的排列必须是波浪形,每一个在排列中的人不是波峰就是波谷,如果它既不是波峰也不是波谷排列就是错的. 对于我这种数学渣渣来说,做一道dp题要好久,%>_<% ...

  6. UVa 11795 状压DP Mega Man's Mission

    kill[S]表示消灭机器人的集合为S,剩下的所能杀死的机器人集合. 设d(S)表示杀死机器人集合为S的方法数,答案为d((1<<n) - 1). d(S)可以由d(S')转移过来,其中S ...

  7. android:exported属性

    这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互.如果设置为true,则能够被调用或交互,否则不能.设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定 ...

  8. DataContext.ExecuteQuery的两种方法调用

    ExecuteQuery主要用于DataContext类直接执行SQL语句的查询,在MSDN上有两种执行方法,下面为两种方法的不同调用: 1.ExecuteQuery<TResult>(S ...

  9. apache 虚拟主机配置(根据不同的域名映射到不同网站)

    最近弄了台香港服务器做测试,Web服务器软件用的是Apache2.2,机器只有一台,ip只有一个,但是想测试几个站点,于是尝试了下Apache的虚拟主机配置.之前已经写过一篇博文了——<Apac ...

  10. python - 自动化测试框架 - 测试报告

    testSuitr.py: # -*- coding:utf-8 -*- '''@project: Voctest@author: Jimmy@file: testSuite.py@ide: PyCh ...