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. laravel中redis各方法的使用

    在laravel中使用redis自带方法的时候会发现许多原生的方法都不存在了,laravel对其进行了重新的封装但是在文档中并没有找到相关的资料最后在 \vendor\predis\predis\sr ...

  2. python中文件操作的其他方法

    前面介绍过Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open('poems','r', ...

  3. python3 简单服务器监控,自动发送邮件

    import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimpo ...

  4. 利用for循环和range输出9 * 9乘法口诀表

    li = [2, 3, 4, 5, 6, 7, 8, 9, 10] for i in li: for j in range(1, i): print('{0} * {1} = {2}'.format( ...

  5. ARM CORTEX-M3的时钟

    转载自:http://www.cnblogs.com/javado/p/7704579.html 这几天写了一段测试代码,跑在LPC812上面. 很吃惊的发现CPU速度为1M 时钟 串口为12M时钟 ...

  6. phpMyAdmin关于PHP 5.5+ is required. Currently installed version is: 5.4.16问题

    出现这个提示PHP 5.5+ is required. Currently installed version is: 5.4.16原因可能是: phpmyadmin 版本太新,最小需要php5.5. ...

  7. 关于sizeof,对空指针sizeof(*p)可以吗?

    C/C++的sizeof在动态分配内存时经常用到,但之前一直没怎么关注它的具体机制.今天在为一个复杂声明的指针分配内存时,想起来要了解一下sizeof到底是什么? 先抛个问题: 程序运行过程中对空指针 ...

  8. UVa 12167 & HDU 2767 强连通分量 Proving Equivalences

    题意:给出一个有向图,问最少添加几条有向边使得原图强连通. 解法:求出SCC后缩点,统计一下出度为0的点和入度为0的点,二者取最大值就是答案. 还有个特殊情况就是本身就是强连通的话,答案就是0. #i ...

  9. K-means算法的优缺点

    K-means算法的优缺点 优点:原理简单,实现容易 缺点: 收敛较慢 算法时间复杂度比较高 \(O(nkt)\) 不能发现非凸形状的簇 需要事先确定超参数K 对噪声和离群点敏感 结果不一定是全局最优 ...

  10. curl保存图片

    $url = 'http://p1.qhimg.com/t013dfc89f8a039122c.jpg?size=690x460'; function http_get_data($url) { $c ...