问题描述

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

算法思路

定义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. C++入门知识点总结

    阅读目录 1 C++中的命名空间 C++中使用命名空间来解决在相同文件或范围的同名变量问题,示例程序如下: #include <iostream> using namespace std; ...

  2. Bryce1010的微机接口课设

    8086CPU知识回顾 8086 CPU 中寄存器总共为 14 个,且均为 16 位 . 即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个. 而 ...

  3. DP(两次) UVA 10163 Storage Keepers

    题目传送门 /* 题意:(我懒得写,照搬网上的)有n个仓库,m个人看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人有一个能力值pi,如果他看管k个仓库,那么所看管的每个仓库的安全值为 ...

  4. Python 学习之Virtualenv

    Virtualenv是一个python环境的隔离工具,主要解决库的隔离和权限问题 Refer:中文版Virtualevn解释 用virtualenv创建多个python环境 我们360如何使用pyth ...

  5. Java数据类型和MySql数据类型对应一览 [转]

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  6. 触发器deleted 表和 inserted 表详解

    摘要:触发器语句中使用了两种特殊的表:deleted 表和 inserted 表. create trigger updateDeleteTimeon userfor updateasbegin  u ...

  7. 【C++】异常简述(一):C语言中的异常处理机制

    人的一生会遇到很多大起大落,尤其是程序员. 程序员写好的程序,论其消亡形式无非三种:无疾而终.自杀.他杀. 当然作为一名程序员,最乐意看到自己写的程序能够无疾而终,因此尽快的学习异常处理机制是非常重要 ...

  8. 获取tomcat服务器上的部分日志

    Linux下tomcat的日志很大,有的几G大,要用什么工具查看或把日志文件拆解? 一般习惯用 tail 的方式在服务器查看.如果要取下 可以用 tail -2000 xxxx.log > te ...

  9. Flask框架 之数据库扩展Flask-SQLAlchemy

    一.安装扩展 pip install flask-sqlalchemy pip install flask-mysqldb 二.SQLAlchemy 常用的SQLAlchemy字段类型 类型名 pyt ...

  10. mysql5.7 this is incompatible with sql_mode=only_full_group_by错误

    解决办法: https://blog.csdn.net/qq_42175986/article/details/82384160 前言: 一.原理层面 这个错误发生在mysql 5.7 版本及以上版本 ...