问题描述

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

算法思路

定义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. codeforces 570 D. Tree Requests (dfs)

    题目链接: 570 D. Tree Requests 题目描述: 给出一棵树,有n个节点,1号节点为根节点深度为1.每个节点都有一个字母代替,问以结点x为根的子树中高度为h的后代是否能够经过从新排序变 ...

  2. C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

    C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变 ...

  3. 利用Wamp在本地搭建一个wordpress站点

    原文链接:利用Wamp在本地搭建一个wordpress站点 有时候我们会想搭建一个自己的站点,可是由于只是想自己访问,就不是很想为这个站点在买一个服务器和域名,那我们可能首先就想到把自己电脑当做服务器 ...

  4. Objective-C Foundation 框架 Example :Looking for Files 查找文件

    Objective-C Foundation 框架    Example :Looking for Files  查找文件 NSFileManager. The NSFileManager class ...

  5. 将php中session存入redis中

    PHP 的会话默认是以文件的形式存在的,可以配置到 Redis 中,即提高了访问速度,又能很好地实现会话共享! 配置方式如下: 方法一:修改 php.ini 的设置 session.save_hand ...

  6. EasyUI edatagrid插件使用小计

    html片段 <table id="menuview" style="width:100%"> <thead> <tr> & ...

  7. swiper移动端下不能正常轮播的解决方案-----此坑没躺过估计很难找到正确姿势

    <script> var mySwiper = new Swiper('.swiper-container', { direction: 'vertical', //horizontal横 ...

  8. codevs 1082 线段树练习 3 --分块练习

    时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...

  9. jekyll 将纯文本转化为静态网站和博客 静态网站生成器

    jekyll 将纯文本转化为静态网站和博客 静态网站生成器 这个貌似对windows 支持不是很好~ 但是有支持,官方说不建议使用

  10. 类unix系统 递归删除指定文件

    递归删除当前目录下所有以 ._开头的文件 find . -name "._*" | xargs rm -f 或者: find . -name "._*" -ex ...