题目描述

时间限制:5.0s 内存限制:256.0MB

问题描述

   给定\(n\)个结点两两之间的单向边的长度,求两两之间的最短路径。

输入格式

   输入第一行包含一个整数\(n\),表示点数。

   接下来\(n\)行,每行包含\(n\)个整数,第\(i\)行表示第\(i\)个点到每个点的边的长度,如果没有边,则用\(0\)表示。

输出格式

   输出\(n\)行,第\(i\)行表示第\(i\)个点到其他点的最短路径长度,如果没有可达的路径,则输出\(-1\)。

样例输入

 3
0 1 0
0 0 6
0 2 0

样例输出

 0 1 7
-1 0 6
-1 2 0

数据规模和约定

   \(1\leq n\leq 1000\),\(0<\)边长\(\leq 10000\)。

解析

Floyd 算法:

   \(a_{ij} 表示\)i\(到\)j\(之间的边长,当\)i\(到\)j$之间没有变时取无限大.

   \(f_{kij}\) 表示\(i\)到\(j\)允许使用节点\(1~k\)作为中间节点.

   目标:\(f_{nij}\)

   初值:\(f_{0ij} = a_{ij}\) 表示从\(i\)到\(j\)不允许经过其他节点作为中间节点,所以\(i\)到\(j\)的距离就是\(a_{ij}\)。

   转移方程:$f_{kij} = min(f_{k-1ij}, f_{k-1ik} + f_{k-1kj})

不用k点作为中间节点 用

   因为用三维数组内存超大,需要优化

优化:

   可以压缩一个维度————k

   可以使用滚动数组,只需f[2][n][n],大大减小了数组内存占用

   于是f[k % 2][i][j] = min(f[(k - 1) % 2][i][j], f[(k - 1) % 2][i][k] + f[(k - 1) % 2][k][j])

#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int INF = 1e9;
int a[1005][1005];
int f[2][1005][1005]; int main(int argc, char** argv) {
int n; cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (a[i][j] != 0) f[0][i][j] = a[i][j];
else if (i != j) f[0][i][j] = INF;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
f[k % 2][i][j] = min(f[(k - 1) % 2][i][j], f[(k - 1) % 2][i][k] + f[(k - 1) % 2][k][j]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (f[n % 2][i][j] == INF) cout << -1 << " ";
else cout << f[n % 2][i][j] << " ";
}
cout << endl;
}
return 0;
}

多源最短路-Floyd的更多相关文章

  1. 模板C++ 03图论算法 2最短路之全源最短路(Floyd)

    3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...

  2. 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

    再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...

  3. 多源最短路Floyd 算法————matlab实现

    弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...

  4. 多源最短路——Floyd算法

    Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...

  5. 多源最短路(floyd算法)

    Floyd算法: 如何简单方便的求出图中任意两点的最短路径 Floyd-Warshall算法(O(n)比较适用于边较多的稠密图(Dense Graph)) Floyd算法用来找出每对顶点之间的最短距离 ...

  6. Floyd多源最短路

    可以对每一个顶点使用Dijkstra算法求多源最短路. 这里我们来介绍另一种解法:Floyd Floyd算法的主要思想是迭代.每次迭代会朝着答案更近一步. 首先定义一个二维数组Dk[i][j](k初始 ...

  7. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  8. 最短路 - floyd算法

    floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ...

  9. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

随机推荐

  1. sql-labs 1-14

    less-1: 1.采用二分法进行猜列: http://192.236.147.191:30000/Less-1/?id=1' order by 10--+ Welcome    Dhakkan Un ...

  2. ROC and AUC

    目录 概 TPR, FPR ROC and AUC 代码 ROC-wiki 概 AUC常常在文章中作为评价一个分类器优劣的指标, 却总是忘记其原由, 索性记上一笔. TPR, FPR 首先理解TP, ...

  3. VS Code 如何设置大小写转换快捷键

    一般情况下,快捷键如下: 转换为大写:Ctrl+Shift+u 转换为小写:Ctrl+Shift+l 如果不行的话,需要单独进行设置,步骤如下: 1.点击[文件]-[首选项]-[键盘快捷方式]菜单: ...

  4. MongoDB基本介绍与安装(1)

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...

  5. Spring企业级程序设计 • 【第6章 深入Spring MVC开发】

    全部章节   >>>> 本章目录 6.1 模型数据解析及控制器返回值 6.1.1 ModelAndView多种用法 6.1.2  Map添加模型数据和返回String类型值 6 ...

  6. Python 国内镜像源

    让 python pip 使用国内镜像源 国内镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.co ...

  7. Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口

    更好阅读体验:Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口 问题 Java集合源码为什么设计为:「实现类继承了抽象类,同时实现抽象类实现的接口?」 看着List 集合的UML ...

  8. js对象数组多字段排序

    来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...

  9. 信不信由你!iPhone6屏幕宽度不一定是375px,iPhone6 Plus屏幕宽度不一定是414px

    看到这个题目你可能不信,引出这个问题的缘由是几次项目中Chrome模拟器和iPhone6真机预览效果不一致. 为什么在Chrome Emulation模拟手机页面和真机预览效果不一致? 以前觉得不外乎 ...

  10. 【Java】toString

    toString 当我们输出一个对象的引用时,实际上就是调用当前对象的toString() Object类中toString()的定义: public String toString() { retu ...