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 紧急救援的更多相关文章

  1. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  2. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  3. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  4. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  5. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  6. PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

  7. PAT天梯赛练习题 L2-013 红色警报(并查集+逆序加边)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  8. PAT天梯赛 L1-050 倒数第N个字符串

    题目链接:点击打开链接 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, ...

  9. PAT天梯赛L2-008 最长对称字符串

    题目链接:点击打开链接 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&a ...

随机推荐

  1. strictmode

    最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...

  2. regress

    #! /bin/ksh ############### ###   UAT   ### ############### export ENVS=/test/change/env/env_test.sq ...

  3. Spring MVC中前后台数据传输小结

    前台向后台传递参数: @ResponseBody @RequestMapping(value = "/findById/{id}", method = { RequestMetho ...

  4. OpenGL ES着色器语言之着色概览(官方文档)

    OpenGL ES着色器语言之着色概览(官方文档第二章) 事实上,OpenGL ES着色语言是两种紧密关联的语言.这些语言用来在OpenGL ES处理管线的可编程处理器创建着色器. 在本文档中,除非另 ...

  5. easyui-combobox select 设置不分行(只显示在一行)

    使用easyui 1.4.4 <select id="hotalid" class="easyui-combobox" data-options=&quo ...

  6. POJ2299--树状数组求逆序数

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  7. Lucene 简单手记http://www.cnblogs.com/hoojo/archive/2012/09/05/2671678.html

    什么是全文检索与全文检索系统? 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查 ...

  8. Lucene入门教程(转载)

    http://blog.csdn.net/tianlincao/article/details/6867127 Lucene教程 1 lucene简介 1.1 什么是lucene     Lucene ...

  9. java应用程序中判断用户输入的一个整数是否在已知数组里。

    import java.util.*; class Example2_5 { public static void main(String args[]) { int start=0,end,midd ...

  10. 转:Windows平台配置Appium+Java环境

    1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装 ...