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. VirtualBox 更改主机和虚拟机之间的鼠标切换热键

    VirtualBox 主机和虚拟机之间的鼠标切换热键 是 Right Ctrl.一般用惯VM Ware的都不太习惯,那么怎么改变VirtualBox鼠标切换热键呢? 1.点击菜单栏的   管理--&g ...

  2. Y5V贴片电容(MLCC)容量范围速查表

    Y5V贴片电容简述 Y5V贴片电容属于EIA规定的Class 2类材料的电容.它的电容量受温度.电压.时间变化影响大. Y5V贴片电容特性 具有较差的电容量稳定性,在-25℃-85℃工作温度范围内,温 ...

  3. 深度探索QT窗口系统(五篇)

    窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打 ...

  4. 浅谈 android-query

    介绍:android-query他是在GitHub上的一个开源轻量级的封装库,它集成了网络 .图片加载等模块,可以应用在android中的一些异步应用以及UI的操纵上,通过使用这个框架,使androi ...

  5. uva 719 Glass Beads(后缀自动机)

    [题目链接] https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=524&am ...

  6. Please ensure that adb is correctly located at '...adb.exe' and can be executed.

    Android Launch! The connection to adb is down, and a severe error has occured. You must restart adb ...

  7. 1396 - Most Distant Point from the Sea

    点击打开链接 题意: 按顺序给出一小岛(多边形)的点 求岛上某点离海最远的距离 解法: 不断的收缩多边形(求半平面交) 直到无限小 二分收缩的距离即可 如图 //大白p263 #include < ...

  8. HTML5 RPG游戏示例

    演示地址 点击打开链接

  9. js 时间戳转换成时间格式,可自定义格式

    由于 c# 通过ajax获取的时间 传到前台 格式为:/Date(1354116249000)/ 所以需要转换一下,想要什么格式 更改 format() 里的 返回语句 就可以了 formatDate ...

  10. 捉Bug:易车注册页布局小臭虫 附demo

    --------<!--文章开始-->-------- 开场show:这几天天气异常燥热,早上起来从棉毛衣换到了小短袖,配上一杯冷泡乌龙茶,真是没谁了,这哥们懂得享受哈 开始鼓捣博客,把博 ...