问题描述

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

算法思路

定义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. cmdb客户端服务器信息采集一

    #cmdb脚本程序一 #!/usr/bin/python # coding:utf-8 """ 采集机器自身信息 1 主机名 2 内存 3 ip与mac地址 4 cpu信 ...

  2. 216 Combination Sum III 组合总和 III

    找出所有可能的 k 个数,使其相加之和为 n,只允许使用数字1-9,并且每一种组合中的数字是唯一的.示例 1:输入: k = 3, n = 7输出:[[1,2,4]]示例 2:输入: k = 3, n ...

  3. 理解http浏览器的协商缓存和强制缓存

    阅读目录 一:浏览器缓存的作用是什么? 二:理解协商缓存 1 Last-Modified/if-Modify-Since 2 ETag/if-None-Match 三:理解强制缓存 回到顶部 一:浏览 ...

  4. php中 mysql 插入特殊字符(手机端的emoji表情)出现异常

    今天在用mysql存储从微信服务器拉来的数据,出现插入数据异常,报 Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F 的错误. 最终在网上查了一下,有 ...

  5. Farseer.net轻量级开源框架 中级篇:BasePage、BaseController、BaseHandler、BaseMasterPage、BaseControls基类使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 下一篇:Farseer.net轻量级开源框架 中 ...

  6. JavaScript回文数

    基本解决方案 function palindrome(str) { return str.replace(/[\W_]/g, '').toLowerCase() === str.replace(/[\ ...

  7. (转)淘淘商城系列——VMware添加已配置好的虚拟机

    http://blog.csdn.net/yerenyuan_pku/article/details/72802323 我们有时候会碰到虚拟机环境搭建特别麻烦,很容易出错的问题,而这时我们又刚好有别人 ...

  8. DEALLOCATE - 删除一个准备好的查询

    SYNOPSIS DEALLOCATE [ PREPARE ] plan_name DESCRIPTION 描述 DEALLOCATE 用于删除前面准备好的查询. 如果你没有明确 DEALLOCATE ...

  9. 所有的工作目录 都要svn_开头,并且要进行svn同步,你能保证你不删除,你保证不了非你!

    所有的工作目录 都要svn_开头,并且要进行svn同步,你能保证你不删除,你保证不了非你! 血的代价啊~

  10. vsphere中的vcenter创建esxi模板虚拟机新建无法连接网络

    1.删除网卡配置文件下的uuid和hwaddr  这是因为虚拟机模板创建网卡mac没改变 2.删除规则文件 rm -f /etc/udev/rules.d/-prtsistent-net.rules ...