天梯杯 PAT L2-001. 紧急救援 最短路变形
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出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. 紧急救援 最短路变形的更多相关文章
- 天梯杯 PAT L2-013 红色警报
战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...
- PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...
- POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Description Background Hugo ...
- HDOJ find the safest road 1596【最短路变形】
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HN0I2000最优乘车 (最短路变形)
HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...
- Heavy Transportation POJ 1797 最短路变形
Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...
随机推荐
- Js 基础知识1
JS比较运算符,有两种比较运算符: 第一种是==比较,它会自动转换数据类型再比较 第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较. 不要使用==比较, ...
- spring boot 学习笔记(二)之打包
一.叙述 spring boot 在 pom 中可以配置成 packaging 为 jar ,这样打包出来的就是一个 jar 包,可以通过 Java 命令直接运行, Java 命令为: java - ...
- OV SSL证书有哪些功能?网站安装OV SSL证书的好处
OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...
- thinkphp3.2集成极光推送
项目中用到了给客户端的推送功能,选用了极光推送,下面演示一下在thinkphp中集成极光推送 1.下载极光推送的php类,可以从笔者的git下载 地址:https://git.oschina.net/ ...
- Git 服务使用搭建集合
Git 服务使用搭建集合 一.本地Git 仓库搭建与使用 1.Git 概念介绍 版本控制系统 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统.大部分时候我们使用最频繁的还是对源 ...
- L1063 能量项链
1 #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = a; i <= b ...
- Netty学习(一)-为什么选择Netty
前面我们简单学习了NIO.我们知道java的I/O模型一共有四种,分别是:传统的BIO,伪异步I/O,NIO和AIO.为了澄清概念和分清区别,我们还是先简单的介绍一下他们的概念,然后再去比较优劣.以及 ...
- 【CodeForces - 1200C】Round Corridor (数论gcd)
Round Corridor Descriptions Amugae位于一个非常大的圆形走廊中.走廊由两个区域组成.内部区域等于nñ扇区,外部区域等于m米部门.在相同区域(内部或外部)的每对扇区之间 ...
- java封装 redis 操作 对象,list集合 ,json串
/** * 功能说明: * 功能作者: * 创建日期: * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com */package com.redis.service; import ...
- js常见兼容性问题以及解决方法
1.关于使用 event对象,出现的兼容性问题IE/Chrom: event.clientX;event.clientYFF/IE9以上/Chrom: 传参e e.clientX;e.client ...