PAT 天梯赛 L2-1 紧急救援
Dijkstra算法扩展
解题代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define mt memset
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 510;
int N,M,S,D;
int mp[maxn][maxn],team[maxn],dis[maxn],cnt_team[maxn],cnt_road[maxn],pre[maxn];
//邻接矩阵,每个城市救援队数,源点到各点最短路,源点到各点最大救援队数,源点到各点最短路条数,父节点
bool vis[maxn];
void path(int x) {
if(x == -1)return ;
if(pre[x] != -1) {
path(pre[x]);
cout << " " << x;
}else {
cout << x;
}
}
void dijkstra() {
for(int i = 0; i < N; i++) {
dis[i] = mp[S][i];
vis[i] = false;
pre[i] = (i == S? -1: S);
if(i != S) {
if(dis[i] != inf) {
cnt_team[i] = team[S] + team[i];
}else {
cnt_team[i] = team[i];
}
}else {
cnt_team[i] = team[S];
}
cnt_road[i] = 1;
}
vis[S] = true;
for(int i = 1; i < N; i++) {
int _min = inf, pos = -1;
for(int j = 0; j < N; j++) {
if(!vis[j] && _min > dis[j]) {
_min = dis[j];
pos = j;
}
}
if(inf == _min || -1 == pos)continue;
vis[pos] = true;
for(int j = 0; j < N; j++) {
if(!vis[j]) {
if(dis[j] > dis[pos]+mp[pos][j]) {
dis[j] = dis[pos]+mp[pos][j];
cnt_road[j] = cnt_road[pos];
cnt_team[j] = cnt_team[pos]+team[j];
pre[j] = pos;
}else if(dis[j] == dis[pos]+mp[pos][j]) {
cnt_road[j] = cnt_road[j]+cnt_road[pos];
if(cnt_team[j] < cnt_team[pos]+team[j]) {
cnt_team[j] = cnt_team[pos]+team[j];
pre[j] = pos;
}
}
}
}
}
cout << cnt_road[D] << " " << cnt_team[D] << endl;
path(D);
cout << endl;
}
int main() {
while(~scanf("%d%d%d%d", &N, &M, &S, &D)) {
for(int i = 0; i < N; i++) {
scanf("%d", &team[i]);
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
mp[i][j] = (i == j?0:inf);
}
}
int u,v,w;
for(int i = 0; i < M; i++) {
scanf("%d%d%d", &u, &v, &w);
mp[u][v] = mp[v][u] = w;
}
dijkstra();
}
return 0;
}
总结
这道题目非常适合用来加深理解Dijkstra算法,其中用到的关于到达每个点的最短路路径数目的记录,与计算到达每个点的最大的救援队数目,利用了一些动态规划的思想,十分的巧妙。
之前打ACM的时候对模板的依赖太多,所以现在要慢慢对每种经典算法进行熟悉理解,争取做到能够手敲,而不是一味的复制粘贴模板。共勉。
参考资料
PAT 天梯赛 L2-1 紧急救援的更多相关文章
- PAT天梯赛 L1-049 天梯赛座位分配
题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...
- PAT天梯赛L3-007 天梯地图
题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...
- PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
- PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)
L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)
L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...
- PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)
L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...
- PAT天梯赛 L1-050 倒数第N个字符串
题目链接:点击打开链接 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, ...
- PAT天梯赛L2-008 最长对称字符串
题目链接:点击打开链接 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&a ...
随机推荐
- 缩放系列(一):一个很好的bitmap手势缩放demo(多点触控)
认识事物都遵循由简入繁的顺序,下面我们想实现一个控件或者一个布局的缩放,先从简单的例子开始吧,我们就以缩放图片做入门. 效果图: 一.要求 利用ScaleGestureDetector这个类实现图片缩 ...
- url重写步骤
url重写:在global文件中,在application_BeginRequest事件中1:获取URL string url=Request.AppRelativeCurrentExecutionF ...
- Qt之QTextCodec乱谈
何处开始呢? 一旦在Qt程序中出现latin1字符集以外的字符,几乎大家无一例外的会用到 QTextCodec. 而不少网友不分青红皂白,一旦用到中文,就同时使用下面3条指令(其中textc 取为 g ...
- shell脚本字符串截取
假设有变量 var=http://www.google.com/test.htm 一 # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符,*/ ...
- iptables基础知识
iptables防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables,因此理解如何配置 iptables将会帮助你更有效地管理Linux防火墙.如果你是第一 ...
- Python 入门基础学习
Python入门学习 我们使用python3.0版本 首选来入门 带你进入Hello World >>> print ("Hello World")Hell ...
- git repository 的使用
1. You should only be pushing to a bare repository. A bare repository is a repository that has no ch ...
- 1.2 eclipse使用 :working set
working set可以是相当于文件夹~~有多个project时, 分别存放在不同的 workingset下,可以方便管理 新建或编辑 working set时,需要记住选择project *可参照 ...
- GDT、GDTR、LDT、LDTR的理解
GDT是全局描述附表,主要存放操作系统和各任务公用的描述符,如公用的数据和代码段描述符.各任务的TSS描述符和LDT描述符.(TSS是任务状态段,存放各个任务私有运行状态信息描述符)LDT是局部描述符 ...
- oracle递归查询子节点
通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...