Floyed算法(实际是动态规划问题)
  问题:权值矩阵matrix[i][j]表示i到j的距离,如果没有路径则为无穷
     求出权值矩阵中任意两点间的最短距离

  分析:对于每一对定点u,v看是否存在一个点w使从u到w再到v的路径长度比已知路径短
  如果有则更新从u到w的距离
  参考网页
  1:不用状态压缩的动态规划算法:
    状态定义:d[1][i][j]表示以1作为媒介时从i到j的最短距离
         d[2][i][j]表示以1,2中的点作为媒介时从i到j的最短距离
         ……
        d[n][i][j]表示以1,2, ……n中的点作为媒介时从i到j的最短距离

        状态转移方程d[k][i][j] = min(d[k-1][i][j], d[k-1][i][j]+d[k-1][k][j]);

        理解为把i到j的路径氛围两种情况,一种不经过k,一种经过k

  2:状态压缩表示:
    假设用d[i][j]表示从i到j的最短路径
    由于d[i][j]在计算中重复使用,因此表示阶段的那一维被取消了
    在没有计算出来新的d[i][j]的时候d[i][j]存储的实际是d[k-1][i][j]的值
    因此可以省去表示阶段的那一维
    状态转移方程:d[i][j] = min(d[i][j], d[i][j]+d[k][j]);

int matrix[M][M];
void floyed_orginal(int n)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
d[][i][j] = matrix[i][j];
}
for(int k = ; k <= n; k++)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
d[k][i][j] = min(d[k-][i][j], d[k-][i][k]+d[k-][k][j]);
}
}
}
void floyd()
{
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

路经压缩之前的floyed算法测试代码

/*  本程序中节点标号1,2,……n
floyed算法:
floyed算法实际上是动态规划,
对于任意两个点u,v,看是否存在一个点w,使得从u到w再到v的距离比从u直接到v的距离短 d[k][i][j]存储从i到j经过1, 2, ……k,的路径中的最短路径
比如d[1][i][j]存存储经过1时从i到j的最短距离
d[2][i][j]存储经过1, 2中的点时时从i到j的最短距离 得到状态转移方程d[k][i][j] = min(d[k-1][i][j], d[k-1][i][k]+d[k-1][k][j]);
*/
#define M 100
#define INF 0x3f3f3f
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int d[M][M][M];
int mat[M][M];
int n, m;
void FloyedOrginal()
{
//无论经不经过中间节点,任意两点间的最短距离初始化为无穷
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
d[i][k][k] = INF;
//不经过中间节点的时候两点间的距离初始化为两点间本身的距离
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
d[][i][j] = mat[i][j];
//动态规划过程
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
d[k][i][j] = min(d[k-][i][j], d[k-][i][j]+d[k-][k][j]);
}
void Init()
{
printf("请输入节点的个数\n");
scanf("%d", &n);
printf("请输入已知数据的组数\n");
scanf("%d", &m);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
mat[i][j] = INF;
for(int i = ; i < m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
mat[u][v] = mat[v][u] = w;
}
}
int main()
{
Init();
FloyedOrginal();
printf("%d", d[n][][n]);
return ;
}

路径压缩之后

/*  本程序中节点标号1,2,……n
floyed算法:
floyed算法实际上是动态规划,
对于任意两个点u,v,看是否存在一个点w,使得从u到w再到v的距离比从u直接到v的距离短 d[i][j]存储从i点到j点的最短距离
*/
#define M 100
#define INF 0x3f3f3f
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int mat[M][M];
int n, m;
void FloyedOrginal()
{
//用k遍历所有中间节点的可能
for(int k = ; k <= n; k++)
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
mat[i][j] = min(mat[i][j], mat[i][k]+mat[k][j]);//是否经过k
}
void Init()
{
printf("请输入节点的个数\n");
scanf("%d", &n);
printf("请输入已知数据的组数\n");
scanf("%d", &m);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
mat[i][j] = INF;
for(int i = ; i < m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
mat[u][v] = mat[v][u] = w;
}
}
int main()
{
Init();
FloyedOrginal();
printf("%d", mat[][]);
return ;
}

floyed算法的更多相关文章

  1. POJ 3660 Cow Contest(传递闭包floyed算法)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5989   Accepted: 3234 Descr ...

  2. poj3259Wormholes (Bellman_Ford/SPFA/Floyed算法判断是否存在负环)

    题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES ...

  3. floyed算法的一些感想

    for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) if(f[i][k]+f[k][j]<f[i ...

  4. Floyed算法 最短路径

    #include<iostream>#include<cstdio>int v,e,n; //v是顶点数,e是条数int v1[101][101],path[101][101] ...

  5. SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)

    图结构练习——最短路径 Time Limit: 1000 ms            Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  6. POJ - 3660 Cow Contest 传递闭包floyed算法

    Cow Contest POJ - 3660 :http://poj.org/problem?id=3660   参考:https://www.cnblogs.com/kuangbin/p/31408 ...

  7. [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

    以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...

  8. Floyed(floyd)算法详解

    是真懂还是假懂? Floyed算法:是最短路径算法可以说是最慢的一个. 原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径): 但它适合算多源最短路径,即任意两点间的距离. 但sp ...

  9. 最短路算法(floyed+Dijkstra+bellman-ford+SPFA)

    最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Flo ...

随机推荐

  1. 安装64位Oracle 10g超详细教程

    安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...

  2. android小知识之SparseArray(HaspMap替换)

    最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能.那我们就来看看源码中SparseAr ...

  3. SSD的优势

    谈过SSD的发展历史后,现在我们来讲解下SSD相比传统HDD(机械硬盘)的优势. 相信很多读者只要有听说过SSD,必定都会听到对SSD优点的一个字总结:快! 但这一个字要如何去理解呢?很多人可能还不太 ...

  4. div图片垂直居中

    div相对与table对于图片的垂直居中支持的并不好,特别对于不同浏览器的兼容性来说,这里我们看下一个简洁的css解决方法: 在曾经的 淘宝UED 招聘 中有这样一道题目: “使用纯CSS实现未知尺寸 ...

  5. c++ 静态多态与动态多态

    多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为.多态是面向对象程序设计的基础.在面向对象程序设计中的多态是一种运行时的多态.C++中有两种多态,称为动多态(运行时 ...

  6. C++STL之string (转)

    在学习c++STL中的string,在这里做个笔记,以供自己以后翻阅和初学者参考. 1:string对象的定义和初始化以及读写 string s1;      默认构造函数,s1为空串 string ...

  7. [Docker]初次接触

    Docker 初次接触 近期看了不少docker介绍性文章,也听了不少公开课,于是今天去官网逛了逛,发现了一个交互式的小教程于是决定跟着学习下. 仅仅是把认为重点的知识记录下来,不是非常系统的学习和笔 ...

  8. SQL Server索引进阶:第一级,索引简介

    这个并不是我翻译的,全文共有15篇,但我发现好多网站已经不全,所以自己整理. 原文地址: Stairway to SQL Server Indexes: Level 1, Introduction t ...

  9. hasOwnProperty和isPrototypeOf方法使用

    hasOwnProperty():判断对象是否有某个特定的属性.必须用字符串指定该属性.(例如,o.hasOwnProperty("name"))  //复制自w3cschool ...

  10. myeclipse优化设置

    一.myeclipse字体设置Window->Preferences->General->Appearance->Colors and Fonts在右侧找到”Aa Test F ...