本文是最短路径算法整理的第二篇,想阅读第一篇的朋友能够点击下面链接:

http://blog.csdn.net/hjd_love_zzt/article/details/26739593

这一篇博客继续以一些OJ上的题目为载体,整理一下最短路径算法。会陆续的更新。。。

1、HDU 2544

题目与分析:这道题抽象一下,还是:“求a到b的最短路径”。。所须要的基本条件是:点数、边数、起点、终点

下面给出floyd、dijkstra、bellmanford三种最短路径算法关于这道题的解法:

1)floyd

/** HDU_2544.cpp**  Created on: 2014年5月31日*      Author: Administrator*/#include <iostream>
#include <cstdio>using namespace std;const int maxn = 105;
const int inf = 10000005;int e[maxn][maxn];
int n;void initial(){int i;int j;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(i == j){e[i][j] = 0;}else{e[i][j] = inf;}}}
}void floyd(){int k;int i;int j;for(k = 1 ; k <= n ; ++k){for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(e[i][j] > e[i][k] + e[k][j]){e[i][j] = e[i][k] + e[k][j];}}}}
}int main(){int m;while(scanf("%d%d",&n,&m),n||m){initial();int i;for(i = 1 ; i <= m ; ++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);e[a][b] = e[b][a] = c;}floyd();printf("%d\n",e[1][n]);}return 0;
}

2)dijkstra

/** HDU_2544.cpp**  Created on: 2014年5月31日*      Author: Administrator*/#include <iostream>
#include <cstdio>using namespace std;const int maxn = 105;
const int inf = 10000005;int n;
int s[maxn];
int dis[maxn];
int map[maxn][maxn];int target;int dijkstra(int v){int i;for(i = 1 ; i <= n ; ++i){s[i] = 0;dis[i] = map[v][i];}// dis[v] = 0;//事实上上面的操作已经包括这个意思了int j;for(i = 1 ; i < n ; ++i){int min = inf;int pos;for(j = 1 ; j <= n ; ++j){if(!s[j] && dis[j] < min){min = dis[j];pos = j;}}s[pos] = 1;for(j = 1 ; j <= n ; ++j){if(dis[j] > dis[pos] + map[pos][j]){dis[j] = dis[pos] + map[pos][j];}}}return dis[target];
}int main(){int m;while(scanf("%d%d",&n,&m),n||m){int i;int j;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= n ; ++j){if(i == j){map[i][j] = 0;}else{map[i][j] = inf;}}}for(i = 1 ; i <= m ; ++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);map[a][b] = map[b][a] = c;}target = n;int result = dijkstra(1);printf("%d\n",result);}return 0;
}

3)bellmanford

/** HDU_2544.cpp**  Created on: 2014年5月31日*      Author: Administrator*/#include <iostream>
#include <cstdio>using namespace std;struct Edge{int u;int v;int weight;
};const int maxn = 105;
const int maxm = 10005;
const int inf = 1000005;Edge edge[maxm];
int dis[maxn];int n,m;
int source;bool bellmanford(){int i;int j;for(i = 1 ; i <= n ; ++i){dis[i] = inf;}dis[source] = 0;for(i = 1 ; i <= n ; ++i){for(j = 1 ; j <= m ; ++j){if(dis[edge[j].v] > dis[edge[j].u] + edge[j].weight){dis[edge[j].v] = dis[edge[j].u] + edge[j].weight;}if(dis[edge[j].u] > dis[edge[j].v] + edge[j].weight){dis[edge[j].u] = dis[edge[j].v] + edge[j].weight;}}}for(j = 1 ; j <= m ; ++j){if(dis[edge[j].v] > dis[edge[j].u] + edge[j].weight){return false;}}return true;
}int main(){while(scanf("%d%d",&n,&m),n||m){int i;for(i = 1 ; i <= m ; ++i){scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].weight);}source = 1;bellmanford();printf("%d\n",dis[n]);}return 0;
}

2、HDU 2066 一个人的旅行

题目分析:

这一道题还是最短路径问题。可是有下面几个不同点:

1》与寻常的给出点数、边数、起点、终点不同。这道题给出了多个起点和终点、而且没有给出点数

这道题我用floyd做的时候TLE了,所以临时仅仅给出dijkstra解法的版本号

/** HDU_2066.cpp**  Created on: 2014年6月1日*      Author: Administrator*/#include <iostream>
#include <cstdio>using namespace std;const int maxn = 1010;
const int inf = 100000005;int s[1015];
int dis[1015];
int map[1015][1015];int start, d;int from[maxn];
int want[maxn];int dijkstra(int v) {int i;for (i = 1; i <= maxn; ++i) {//由于题目没有给出点数,所以每一次都所有扫一遍s[i] = false;dis[i] = map[v][i];}for (i = 1; i < maxn; ++i) {int min = inf;int pos;int j;for (j = 1; j <= maxn; ++j) {if (!s[j] && dis[j] < min) {min = dis[j];pos = j;}}s[pos] = 1;for (j = 1; j <= maxn; ++j) {if (!s[j] && dis[j] > dis[pos] + map[pos][j]) {dis[j] = dis[pos] + map[pos][j];}}}
//到这里就已经算出以点v为起点的最短路径的情况了....这时候再遍历一下ends[],便能求出v到ends[]中哪个终点近期了int minn = inf;for (i = 0; i < d; ++i) {//用来解决多终点的问题int temp = dis[want[i]];if (minn > temp) {minn = temp;}}return minn;
}int main() {int t;while (scanf("%d%d%d", &t, &start, &d) != EOF) {int i;int j;for (i = 1; i <= maxn; ++i) {for (j = 1; j <= maxn; ++j) {if (i == j) {map[i][j] = map[j][i] = 0;} else {map[i][j] = map[j][i] = inf;}}}for (i = 1; i <= t; ++i) {int a, b, c;scanf("%d%d%d", &a, &b, &c);if (map[a][b] > c) {map[a][b] = map[b][a] = c;}}for (i = 0; i < start; ++i) {scanf("%d", &from[i]);}for (i = 0; i < d; ++i) {scanf("%d", &want[i]);}int result = inf;for (i = 0; i < start; ++i) {//用来解决多起点的问题int temp = dijkstra(from[i]);if (result > temp) {result = temp;}}printf("%d\n", result);}return 0;
}

转载于:https://www.cnblogs.com/gcczhongduan/p/4297716.html

最短路径算法整理(二)相关推荐

  1. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

    这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...

  2. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  3. 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描

    首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法. ...

  4. k则最短路径matlab,Yen的K条最短路径算法(KSP)

    一.问题介绍 1.求K条最短路径的必要性 最短路径问题分为: 单源最短路径 所有顶点对间的最短路径 共同的缺陷: 这里的最短路径指两点间最短的那一条路径,不包括次短.再次短等路径.这样的最短路径问题比 ...

  5. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  6. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...

  7. 菜鸟的数学建模之路(一):最短路径算法

    最短路径算法主要有两种,Dijkstra算法和floyd算法,当时在学习这两种算法时经常弄混了,关于这两种算法,记得当时是在交警平台设置的那一道题目上了解到的,就去查很多资料,花了不少时间才基本了解了 ...

  8. Levenshtein distance:算法整理 与 编辑操作推断 【回朔 + Python】

    本文讨论通过Levenshtein distance和单源最短路径搜索算法来推断两个字符串(句子)之间最佳的编辑操作序列.使用到的知识有:动态规划 和 单源最短路径搜索算法. Levenshtein ...

  9. 最短路径算法——Dijkstra and Floyd算法

    一.     前言:     这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...

最新文章

  1. 关于WebService中用到的QName详解
  2. 稀缺:百分之二的选择
  3. sqlite 字符串 转 整型 cast 函数 (强制类型转换 )
  4. mysql cluster linux_【完美】Mysql-cluster数据库集群搭建(linux)
  5. java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...
  6. android 反编译工具_【Android APK分析工具】
  7. 计算机算法设计与分析 最长递增子序列
  8. int定义源码 python_Python代码保护 | pyc 混淆从入门到工具实现
  9. 用于开启php绘图扩展配置为,女儿墙屋面排水列项应选择()。A.雨水管B.雨水斗C.雨水口D.出水弯管E.檐沟...
  10. 数智学习 | 一文读懂数据安全分类分级
  11. 多少开发人员 饿了么_做个美团(饿了么)网站需要多少钱?
  12. “JEPG”到“TXT”,魔幻的Loot
  13. linux 网络编程相关知识
  14. 《信息检索》第10周周二课程分享 及 11周周二分享安排
  15. 【论文学习】UPHDR-GAN: Generative Adversarial Network forHigh Dynamic Range Imaging with Unpaired Data
  16. ECCV2022|何恺明团队开源ViTDet:只用普通ViT,不做分层设计也能搞定目标检测
  17. 海思平台ISP调试经验
  18. 带着问题读源码-soul(2021-01-16)
  19. PyBullet(六)UR5机器人手臂模型
  20. 远程桌面提示CredSSP加密数据库修正

热门文章

  1. SELECT TOP column FROM table [ORDER BY column [DESC]]
  2. stm32上的Lava虚拟机开发进度汇报(3)
  3. SQL Server Management Studio消失了
  4. iw工具安装和使用 (修正版)
  5. py-opp 类(class)
  6. 矩形法求定积分的原理和实现
  7. 历届试题 分考场(DFS,染色问题)
  8. 树状数组 java_算法模板之树状数组
  9. 独家下载!《零售数据中台通关指南》,带你玩转新零售
  10. 阿里云 Serverless 事件总线 EventBridge 重磅发布