问题描述

给出图,求任意两点的最短距离

算法思路

定义n+1个矩阵矩阵A,和记录路径的矩阵path

依次求A0~An的值,最后的An即为最短路径矩阵

// int A[8][7][7],path[7][7]; //A[v+1][i][j] 表示允许0~v的点为中间节点时,i到j的最短距离

A[0][i][j] = G[i][j]; //不允许中间节点时的最短距离就是邻接矩阵

循环:

A[v][i][j] = min(A[v][i][v] + A[v][v][j], A[v][i][j])

实现思路

比较简单,三个for循环即可。

源码

#include <iostream>
using namespace std;
#define MAX 32767
//Floyd算法 :全成对最短路径
//动态规划,每次加入一个点,允许他作为中间节点,更新最短距离矩阵
int main()
{
int n=7, v, i,j;
int G[7][7] = {
0,4,5,6,MAX,MAX,MAX,
4,0,3,MAX,1,MAX,MAX,
5,3,0,MAX,MAX,2,MAX,
6,MAX,MAX,0,2,MAX,MAX,
MAX,1,MAX,2,0,MAX,4,
MAX,MAX,2,MAX,MAX,0,3,
MAX,MAX,MAX,MAX,4,3,0
};
//------------------输入矩阵
//cout << "please input number of vertices:";
//cin >> n;
//cout << "now input the adjency matrix,if no edge,put it -1:";
//for (i = 0; i < n; i++)
// for (j = 0; j < n; j++)
// {
// cin >> G[i][j];
// if (G[i][j] == -1) G[i][j] = MAX;
// }
//------------------定义多个矩阵用来存放每次的最短路径矩阵A,和记录路径的矩阵path
int A[8][7][7],path[7][7]; //A[v+1][i][j] 表示允许0~v的点为中间节点时,i到j的最短距离
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
A[0][i][j] = G[i][j]; //不允许中间节点时的最短距离就是邻接矩阵
if (G[i][j]>0) path[i][j] = i;
else path[i][j] = -1;
} //------------------循环,对于每个点v,遍历所有点对i,j,进行缩短操作
for (v = 0; v < n; v++)
{
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (A[v][i][j]>A[v][i][v] + A[v][v][j])
{
A[v+1][i][j] = A[v][i][v] + A[v][v][j];
path[i][j] = v;
}
else
{
A[v + 1][i][j] = A[v][i][j];
}
}
}
//------------------打印结果矩阵
//for (v = -1; v < n; v++)
//{
//cout << v << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
cout << A[n][i][j] << "\t";
cout << endl;
}
//}
while (1);
return 0;
}

遇到的小坑

1 .打印结果时应为n,写成了n+1

cout << A[n][i][j] << "\t";

2. if 后面忘了跟else

if (A[v][i][j]>A[v][i][v] + A[v][v][j])
{
A[v+1][i][j] = A[v][i][v] + A[v][v][j];
path[i][j] = v;
}
else
{
A[v + 1][i][j] = A[v][i][j];
}

Floyd算法实现总结的更多相关文章

  1. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  2. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  3. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

  4. floyd算法小结

    floyd算法是被大家熟知的最短路算法之一,利用动态规划的思想,f[i][j]记录i到j之间的最短距离,时间复杂度为O(n^3),虽然时间复杂度较高,但是由于可以处理其他相似的问题,有着广泛的应用,这 ...

  5. Uvaoj 10048 - Audiophobia(Floyd算法变形)

    1 /* 题目大意: 从一个点到达另一个点有多条路径,求这多条路经中最大噪音值的最小值! . 思路:最多有100个点,然后又是多次查询,想都不用想,Floyd算法走起! */ #include< ...

  6. Floyd算法(三)之 Java详解

    前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...

  7. Floyd算法(二)之 C++详解

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

  8. Floyd算法(一)之 C语言详解

    本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...

  9. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  10. 最短路径(Floyd)算法

    #include <stdio.h>#include <stdlib.h>/* Floyd算法 */#define VNUM 5#define MV 65536int P[VN ...

随机推荐

  1. Appium教程---Client/Server Architecture

    appium的核心其实是一个暴露了一系列REST API的server. 这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command.翻译这些command,把这些c ...

  2. 支付宝添加scheme的方法

    点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“myAlipay”.“myAlipay”来自于文件“APViewControlle ...

  3. [转]linux之date命令MYSQL用户管理

    转自:http://www.cnblogs.com/hencehong/archive/2013/03/19/mysql_user.html 一.        用户登录 格式: mysql -h主机 ...

  4. T4870 水灾(sliker.cpp/c/pas) 1000MS 64MB

    题目描述 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表 ...

  5. JSP(Java Servlet Page)

    一.简介 HTML HTML擅长显示一个静态的网页,但是不能调用Java程序. Servlet Servlet擅长调用Java程序和后台进行交互,但是它不擅长显示一个完整的HTML页面. 我们希望创建 ...

  6. iOS循环引用

    iOS循环引用 当前类的闭包/Block属性,用到了当前类,就会造成循环引用 此闭包/Block应该是当前类的属性,我们经常对Block进行copy,copy到堆中,以便后用. 单方向引用是不会产生循 ...

  7. node.js入门之一

    简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端Ja ...

  8. leetcode_684. Redundant Connection

    https://leetcode.com/problems/redundant-connection/ 一个无向图,n个顶点有n条边,输出一条可以删除的边,删除后使得图成为一棵树.可以使用并查集解决. ...

  9. iOS截取特定的字符串(正则匹配)

    有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~ 一. 固定长度字符串中截取固定位置长度的字符串 // 这是比较简单的一种情况:比如截取手机号的后4位 let ...

  10. jQuery 全选、全不选、反选

    <!DOCTYPE html> <html lang="en"> <head> <title></title> < ...