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

输入格式:

输入第一行给出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. 【Mybatis】Mybatis的sql模糊查询

    这个网站中有很多方法.https://code.google.com/p/mybatis/issues/detail?id=85 自己试验了如下的方法. 1.  参数中直接加入%% param.set ...

  2. 什么是P问题,NP问题和NPC问题

    转载自:Matrix67的博客 什么是P问题.NP问题和NPC问题 这或许是众多OIer最大的误区之一.    你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问 ...

  3. 洛谷P1345 [USACO5.4]奶牛的电信(最小割)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  4. [区分] 1.计算机网络/internet(互联网) 2.Internet(因特网) 3.www/web(万维网)

    internet(互联网或互连网)是一个通用名词,泛指由多个计算机网络互联而成的虚拟网络.Inernet(因特网)是一个专用名词,指当前全球最大的.开放的.由众多网络相互连接而成的特定的计算机网络,它 ...

  5. hbase 基本的JavaApi 数据操作及数据过滤(filter)

    本文主要是hbase的表操作.数据操作.数据查询过滤等,如果对JDBC或ADO有了解,容易理解HBASE API. hbase版本是2.0. 1.为了方便先贴helper的部分代码(文末git上有完整 ...

  6. 【题解】APIO2014回文串

    哇哦~想不到我有生之年竟然能够做出字符串的题目ヾ(✿゚▽゚)ノ虽然这题比较裸但依然灰常开心! 首先有一个棒棒的性质:本质不同的回文串最多有 O(n) 个.首先 manacher 把它们都找出来,然后问 ...

  7. [TJOI2008]彩灯 线性基

    题面 题面 题解 题意:给定n个01串,求互相异或能凑出多少不同的01串. 线性基的基础应用. 对于线性基中的01串,如果我们取其中一些凑成一个新的01串,有一个重要的性质:任意2个不同方案凑出的01 ...

  8. redis2.4.conf配置文件中文释意

    # Redis示例配置文件 # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1kb => 1024 ...

  9. 洛谷 P1023 税收与补贴问题 (2000NOIP提高组)

    洛谷 P1023 税收与补贴问题 (2000NOIP提高组) 题意分析 一开始没理解题意.啰啰嗦嗦一大堆.看了别人的题解才明白啥意思. 对于样例来说,简而言之: 首先可以根据题目推算出来 28 130 ...

  10. MySQL自定义函数、触发器、存储过程

    存储过程 概念 存储过程,是一个数据库对象,类似一个函数. 在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支). 编写好存储过程之后,可以在客户端调用存储过程,存储 ...