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

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为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

分析:

这是单源点最短路径的题,但是与普通的单源点最短路径之间又有不同的地方,就是我们不仅要保存最短的路径,还要把这条路径上通过的每个点的军队数目的和保存下来,以及最短路径的条数,以及在这些最短路径中那条路能够获得最大的进队数目,还要把这天路径也保存下来。

所以我们需要 保存的信息有很多:

1.最短路径的条数

2.最短路径的走法

3.在这条路径上获得的军队数目和

如图:对于需要保存路径数目的最短路,如果dis[]的初始化为各个点到源点的距离的话,(源点是0 终点是3)那么3这个终点只会被松弛一次(即使从0到3距离 与 从0到1再到3 的距离相等,但是经过第二条线路所能召集的军队的数目多余0—->3,所以也要进行讨论),那么对于3来说,他的路线只有一条。

所以要把dis[]初始化为上面的表所示,这样3这个点就会被松弛两次,每松弛一次,他的路径数目就会增加。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#define INF 0x3f3f3f3f
using namespace std;
int N, M, S, D;
int NumArmy[505];//每个点的军队数目
int SumArmy[505];//路径中通过当前点的进队数目和
int map[505][505];
int dist[505];//源点到当前点的最短路径
int parent[505];//路径中的前一个点
int NumLoad[505];//路径数量
int bj[505];//标记数组
void dij(int s)
{
//源点的相关变量进行初始化
SumArmy[s] = NumArmy[s];
parent[s] = -1;
NumLoad[s] = 1;
bj[s] = 1;
dist[s] = 0;
//将源点到每个点的最短路径保存
for (int i = 0; i < N; i++)
{
if (map[s][i] != 0 && map[s][i] != INF)//之间有路径
{
dist[i] = map[s][i];
SumArmy[i] = NumArmy[i] + NumArmy[s];
NumLoad[i] = 1;
parent[i] = s;
}
}
int num = N - 1;
int op = S;
while (num--)
{
int Min = INF;
for (int i = 0; i < N; i++)
{
if (bj[i] == 0 && dist[i] < Min)
{
Min = dist[i];
op = i;
}
}
bj[op] = 1;//找到路径之外的最短距离 for (int i = 0; i < N; i++)
{
if (bj[i] == 0)
{
if (dist[i] > dist[op] + map[op][i])//到i点的最短路径能通过op点变化
{
dist[i] = dist[op] + map[op][i];
SumArmy[i] = SumArmy[op] + NumArmy[i];
NumLoad[i] = NumLoad[op];
parent[i] = op;
}
else //else不能忘,找bug找了好久
if (dist[i] == dist[op] + map[op][i])//虽然路径长度不能变化,可以比较军队数目来改变路径
{
NumLoad[i] = NumLoad[i] + NumLoad[op];
if (SumArmy[i] < SumArmy[op] + NumArmy[i])
{
SumArmy[i] = SumArmy[op] + NumArmy[i];
parent[i] = op;
}
}
}
}
}
}
void Shuchu(int D)
{
if (parent[D] == -1)
{
printf("%d", D);
return ;
}
else
{
Shuchu(parent[D]);
printf(" %d", D);
}
}
int main()
{
scanf("%d%d%d%d", &N, &M, &S, &D);
for (int i = 0; i < N; i++)
{
scanf("%d", &NumArmy[i]);
//初始化
dist[i] = INF;
bj[i] = 0;
NumLoad[i] = 0;
SumArmy[i] = 0;
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
int n1, n2, n3;
for (int i = 0; i < M; i++)
{
scanf("%d%d%d", &n1, &n2, &n3);
map[n1][n2] = map[n2][n1] = min(n3, map[n1][n2]);
}
dij(S);
printf("%d %d\n", NumLoad[D], SumArmy[D]);
Shuchu( D);
return 0;
}

天梯赛 L2-001 紧急救援 (最短路 dij)的更多相关文章

  1. PTA天梯赛L2

    L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可 ...

  2. 天梯杯 PAT L2-001. 紧急救援 最短路变形

    作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...

  3. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

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

  4. 记第一届 CCCC-团体程序设计天梯赛决赛 参赛

    其他都没什么,上午报道,下午比赛两个半小时,最后139分 但四我超遗憾的是,最后在做L3-1二叉搜索树,因为看到有辣么多人做出来,可是我没做出来啊 比赛结束后看了看其他两道当场吐血,L3-3直捣黄龙不 ...

  5. 第四届CCCC团体程序设计天梯赛 后记

    一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...

  6. 团体程序设计天梯赛(CCCC) L3009 长城 方法证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  7. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  8. pat 团体天梯赛 L3-007. 天梯地图

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  9. 【CCCC天梯赛决赛】

    cccc的天梯赛决赛,水题一样的水,中档题以上的还是没做出来.补了一下题,觉得其实也不是很难,主要是练的少. L2-1:红色预警 并查集 我做的时候想不到并查集,想到了也不一定做的出来,都是其实不难. ...

  10. L1-049 天梯赛座位分配​​​​​​​

    L1-049 天梯赛座位分配 (20 分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i ...

随机推荐

  1. 敏捷冲刺DAY5

    一. 每日会议 1. 照片 2. 昨日完成工作 发布和提供需求功能的实现 用户修改自己的信息 用户界面设计 管理员界面设计 3. 今日完成工作 4. 工作中遇到的困难 1.设置的背景无法显示. 2.一 ...

  2. 【leetcode】215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  3. PAT 甲级 1077 Kuchiguse

    https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096 The Japanese language ...

  4. (五)Jmeter中的属性和变量

    一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...

  5. 【数据库】SQL分组多列统计(GROUP BY后按条件分列统计)

    select whbmbh ,zt,1 as tjsl from fyxx group by zt,whbmbh select whbmbh,sum(case zt when '有效' then 1 ...

  6. msiexec安装参数详解

    原文链接地址:https://blog.csdn.net/wilson_guo/article/details/8151632 1 安装 /i表示安装,/x 表示卸载/f表示修复./l*v 表示输出详 ...

  7. html5 video,audio控制播放多次,请求/监测全屏状态

    audio 播放  Element.play();  如果在播放中,调用play,从头播放,则需要先load,同时绑定结束方法,如 Element.addEventListener('ended',f ...

  8. 网络编程----socketserver多并发实现、FTP上传多并发、udp协议套接字多并发

    一.socketserver多并发                                                              基于tcp的套接字,关键就是两个循环,一个 ...

  9. xshell输入奇怪,空格间距变大

    https://www.macx.cn/thread-2018939-1-1.html 按一下shift+空格就行了 全角/半角转换的快捷键... dd

  10. STL源码分析归档

    1) algorithm 2) traits 3) iterator 4) list 5) function 6) rbtree 7) bitset 8) priority_queue 9) hash ...