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

输入格式:

输入第一行给出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. BurpSuite 激活破解

    1.下载软件关于Burp Suite, 它是进行Web应用安全测试的一个集成平台,无缝融合各种安全工具并提供全面的接口适配,支持完整的Web应用测试流程,从最初的映射和应用程序的攻击面分析到发现和利用 ...

  2. 用iptables做代理

    出于安全考虑,Linux系统默认是禁止数据包转发的.配置Linux系统的ip转发功能,打开系统转发功能:echo "1" > /proc/sys/net/ipv4/ip_fo ...

  3. 淘宝免费ip地址查询导致服务堵死的坑

    1.业务中因为想根据用户ip来做一些友好的提示,所以在网上找了个免费的ip查询地址 http://ip.taobao.com/service/getIpInfo.php?ip= 虽然说淘宝的这个地址会 ...

  4. vue-cli3使用cdn方式引入moment.js

    1. index.html引入: <script src="https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"&g ...

  5. PHP面向对象之final关键字

    最终类 最终类,其实就是一种特殊要求的类:要求该类不允许往下继承下去. 形式: final  class  类名{ //类的成员定义...跟一般类的定义一样! } 最终方法 最终方法,就是一个不允许下 ...

  6. 第160天:Http协议的详细总结

    一.HTTP协议 超文本传输协议(HyperText Transfer Protocol),缩写HTTP.通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource I ...

  7. 第75天:jQuery中DOM操作

    一.基础操作 1.html() 使用html()方法读取或者设置元素的innerHTML. 就是相当于javascript里头的innerHTML. 2.text() 使用text()方法读取或者设置 ...

  8. 题解 P1765 【手机_NOI导刊2010普及(10)】

    说实话,打表真的很累! 所以小金羊又开始暴力出奇迹了! 这个题解适合初学者使用. 知识点:string里面的str.find()函数: 可以查找字符串和字符,有就返回位置(开头是0), 没有就返回st ...

  9. bzoj2969 矩形粉刷 概率期望

    此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...

  10. 【HDU5919】SequenceII(主席树)

    [HDU5919]SequenceII(主席树) 题面 Vjudge 翻译(by ppl) 给一个长度为N的数列A,有m个询问,每次问 数列[l,r]区间中所有数的第一次出现的位置的中位 数是多少 题 ...