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. IOS 特定于设备的开发:处理基本方向

    UIDevice类使用内置的orientation属性获取设备的物理方向.IOS设备支持这个属性的7个可能的值. >UIDeviceOrientationUnknown:方向目前未知. > ...

  2. C 查找子字符串

    自己用 C 写的一个查找子字符串的函数 int findstr(char *str,char *substr) //C实现 find{ if(NULL == str || NULL== substr) ...

  3. HTML标签解释大全

      一.HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(DTD).   标签:a 说明:标明超链接的起始或目的位置.   标签:acronym 说明:标明缩写词. ...

  4. SQL语句的MINUS,INTERSECT和UNION ALL

    SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集); 关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其 ...

  5. PCB流程-外型加工

  6. JAVA GUI学习 - JPopupMenu鼠标右键菜单组件学习

    public class JPopmenuKnow { public void test() { //为表格添加鼠标右键菜单 JMenuItem jMenuItemFileInfo = new JMe ...

  7. openStack icehouse for centos6.4 production Env 实战

    production Env brief Overview: Management Node:  controller.cc 10.114.100.115 Neutron Network Node:  ...

  8. swig模板 html代码自然状态下输出是转义的,必须加一个函数来转换为html代码;

    <div>{{o.content|raw}}</div> |raw 相当于一个函数,转义函数,最终输出结果为html代码:

  9. What Is Your Grade?(水,排序)

    What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. Swift 中类的初始化器与继承

    首先,Swift 为类定义了两种初始化器来确保类中所有的储存属性都能得到一个初始化值.这两种初始化器就是「指定初始化器」(Designated Initializer)与「便利初始化器」(Conven ...