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

输入格式:

输入第一行给出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 emmmm,图论一直是弱项,简单的最短路变形一直挺模糊的无从下手,这道题值得好好学习。其实写了以后还是比较好懂的。
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 510
#define debug(a) cout << #a << " " << a << endl
//val每个城市紧急救援队的数量,re代表最短路中紧急队最多的那条路径经过的点,vis判断当前点是否走过
//total代表每个点的最短路中的紧急队最多的数量,pathnum代表当前点的最短路径的数量
//dis代表路径长度,path记录当前点的前驱
int n,m,s,d,val[maxn],mapn[maxn][maxn],re[maxn],vis[maxn];
int total[maxn],pathnum[maxn],dis[maxn],path[maxn];
void dijkstra( int v0 ) {
for( int i = ; i < n; i ++ ) {
dis[i] = 1e9;
}
vis[v0] = true;
dis[v0] = ;
total[v0] = val[v0];
pathnum[v0] = ;
for( int i = ; i < n; i ++ ) {
if( mapn[v0][i] != 1e9 && i != v0 ) {
dis[i] = mapn[v0][i];
path[i] = v0;
total[i] = val[v0] + val[i];
pathnum[i] = ;
}
}
for( int i = ; i < n - ; i ++ ) {
int minn = 1e9, mival = , u = v0;
for( int j = ; j < n; j ++ ) {
if( !vis[j] && dis[j] < minn ) {
minn = dis[j];
u = j;
}
}
vis[u] = true;
for( int j = ; j < n; j ++ ) {
if( !vis[j] ) {
if( dis[u] + mapn[u][j] < dis[j] ) {
pathnum[j] = pathnum[u];
dis[j] = dis[u] + mapn[u][j];
total[j] = total[u] + val[j];
path[j] = u;
} else if( dis[u] + mapn[u][j] == dis[j] ) {
pathnum[j] += pathnum[u];
if( total[j] < total[u] + val[j] ) {
total[j] = total[u] + val[j];
path[j] = u;
}
}
}
}
}
}
int main() {
while( cin >> n >> m >> s >> d ) {
for( int i = ; i < n; i ++ ) {
cin >> val[i];
}
for( int i = ; i < n; i ++ ) {
for( int j = ; j < n; j ++ ) {
mapn[i][j] = 1e9;
}
}
int x,y,l;
for( int i = ; i < m; i ++ ) {
cin >> x >> y >> l;
mapn[x][y] = min( mapn[x][y], l );
mapn[y][x] = mapn[x][y];
}
dijkstra( s );
int num = , cur = d;
while( cur != s ) {
re[num++] = cur;
cur = path[cur];
}
re[num++] = s;
cout << pathnum[d] << " " << total[d] << endl;
for( int i = num - ; i > ; i -- ) {
cout << re[i] << " ";
}
cout << re[] << endl;
}
return ;
}

天梯杯 PAT L2-001. 紧急救援 最短路变形的更多相关文章

  1. 天梯杯 PAT L2-013 红色警报

    战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...

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

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

  3. POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)

    做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...

  4. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  5. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  6. POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K          Description Background  Hugo ...

  7. HDOJ find the safest road 1596【最短路变形】

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. HN0I2000最优乘车 (最短路变形)

    HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...

  9. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

随机推荐

  1. 向.Net/Unity 程序员推荐一个十分因吹斯听的网站:sharplab.io

    0x00 前言 & 过程 & 结论 今天发现了一个十分有趣的网站: https://sharplab.io/ 网站的页面并不复杂,功能大体上能够在题图中得到概括.发现它的过程也很偶然, ...

  2. Netty源码解析---服务端启动

    Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...

  3. Python学习系列:目录

    Python学习系列(二)Python 编译原理简介 Python学习系列(三)Python 入门语法规则1 Python学习系列(四)Python 入门语法规则2

  4. java实现发短信功能---腾讯云短信

    目录 java实现发短信功能 前言 开发环境 腾讯云 ---短信 代码 效果 结束语 java实现发短信功能 前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了 ...

  5. ssm执行流程

    SSM运行流程 1:服务器启动,创建springmvc的前端控制器DispatcherServlet,创建Spring容器对象. 加载spring-servlet.xml .applicationCo ...

  6. imageloader+图片压缩

    public class MainActivity extends AppCompatActivity { private ImageView ivIcon; @Override protected ...

  7. js动态添加<tr><td>

    <form id="addNewsFormData" name="addNewsFormData" isCheck="true" ac ...

  8. 依赖注入在 dotnet core 中实现与使用:1 基本概念

    关于 Microsoft Extension: DependencyInjection 的介绍已经很多,但是多数偏重于实现原理和一些特定的实现场景.作为 dotnet core 的核心基石,这里准备全 ...

  9. Sqlmap过waf命令tamper各脚本的适用环境

    0x00 相信很多小伙伴和我一样感同身受,站上明明有注入可是被万恶的WAF拦截了或者过滤了,这时候就需要用到SQLMAP强大的tamper了. 0x01 使用方法--tamper xxx.py apo ...

  10. Xcodebuild命令使用

    Xcodebuild简介 Xcodebuild是命令行工具包的其中一项. 命令行工具包(Command Line Tools)是一个轻量的.可以与XCode分开的.在Mac上单独下载的命令行工具包. ...