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

输入格式:

输入第一行给出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. Beta 阶段项目计划

    Beta 阶段项目计划 NewTeam 目标 实现用户数量的目标. 在多个平台发布 完成稳定运行.界面优雅的客户端 充分测试,避免发布后出现bug影响用户使用 及时更新开发文档 合理安排时间,避免和其 ...

  2. phaser2 微信小游戏入手

    phaser2小游戏基本没什么什么问题,可以下常开发游戏.如果遇到什么问题, 可以提出来共同讨论. 下面来个例子 import './lib/weapp-adapter'; import Phaser ...

  3. 【JQuery】使用JQuery 合并两个 json 对象

    一,保存object1和2合并后产生新对象,若2中有与1相同的key,默认2将会覆盖1的值 1 var object = $.extend({}, object1, object2); 二,将2的值合 ...

  4. ROC曲线【转】

    受试者工作特征曲线(receiver operating characteristic curve, 简称ROC曲线),又称为感受性曲线(sensitivity curve).得此名的原因在于曲线上各 ...

  5. Struts创建流程

    1.启动服务,加载web.xml 并实例化StrutsPrepareAndExecuteFilter过滤器 2.在实例化StrutsPrepareAndExecuteFilter的时候会执行过滤器中的 ...

  6. BZOJ 3626 LCA(离线+树链剖分)

    首先注意到这样一个事实. 树上两个点(u,v)的LCA的深度,可以转化为先将u到根路径点权都加1,然后求v到根路径上的总点权值. 并且该题支持离线.那么我们可以把一个区间询问拆成两个前缀和形式的询问. ...

  7. 【HLSDK系列】服务端 AddToFullPack 函数

    服务端会给客户端发送一些数据,其中两大种类数据是 clientdata_t 和 entity_state_t 这里我们说说 entity_state_t 这个结构体. 你在丢在地上的枪.C4等等是服务 ...

  8. 升级系统后maxvim不能用,重新下载编译个

    1. 获取macvim源代码git clone https://github.com/b4winckler/macvim.git 2 配置及编译 编译选项 ./configure --with-fea ...

  9. Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)

    这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...

  10. 【loj2639】[Tjoi2017]不勤劳的图书管理员

    #2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...