floyed算法
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算法的更多相关文章
- POJ 3660 Cow Contest(传递闭包floyed算法)
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5989 Accepted: 3234 Descr ...
- poj3259Wormholes (Bellman_Ford/SPFA/Floyed算法判断是否存在负环)
题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES ...
- 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 ...
- Floyed算法 最短路径
#include<iostream>#include<cstdio>int v,e,n; //v是顶点数,e是条数int v1[101][101],path[101][101] ...
- SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)
图结构练习——最短路径 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- POJ - 3660 Cow Contest 传递闭包floyed算法
Cow Contest POJ - 3660 :http://poj.org/problem?id=3660 参考:https://www.cnblogs.com/kuangbin/p/31408 ...
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...
- Floyed(floyd)算法详解
是真懂还是假懂? Floyed算法:是最短路径算法可以说是最慢的一个. 原理:O(n^3)的for循环,对每一个中间节点k做松弛(寻找更短路径): 但它适合算多源最短路径,即任意两点间的距离. 但sp ...
- 最短路算法(floyed+Dijkstra+bellman-ford+SPFA)
最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Flo ...
随机推荐
- python自学笔记(一)简单了解python
脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...
- (iOS)关于GCD死锁的问题
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog("); ...
- ExtJS 修改load paging时的参数
ExtJS 的pagingToolbar 在翻页的时候传入的参数是固定的 分别是start 和 limit(其中limit的值就是store.pageSize的值) 如何在每次翻页的时候传入自己的参 ...
- OP(Over-provisioning)预留空间
SSD上的OP指的是用户不可操作的容量,大小为实际容量减去用户可用容量,OP区域一般被用于优化操作如:WL,GC和坏块映射等. OP一般分三层(见下图).第一层容量固定为SSD标称容量的7 ...
- HDU 5768 Lucky7(CRT+容斥原理)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5768 [题目大意] 求出一个区间内7的倍数中,对于每个ai取模不等于bi的数的个数. [题解] 首 ...
- java ssh
sshj (currently best choice) https://github.com/shikhar/sshj ssh used in jenkins-ci https://github.c ...
- mybatis-generator生成model和dao层代码
.建立文件夹myibatisGen 2.下载mybatis-generator-core-1.3.1.jar或者其它版本的jar包,到myibatisGen文件夹下 3.为生成代码建立配置文件“gen ...
- CreateFileMapping使用方法
CreateFileMapping的MSDN翻译和使用心得 測试创建和打开文件映射的时候老是得到"句柄无效"的错误, 细致看了MSDN以后才发觉是函数认识不透, 这里把相关的解 ...
- iOS 百度地图大头针使用
百度地图使用第五讲:大头针使用(地图标注)http://bbs.yusian.com/thread-8384-1-1.html(出处: 小龙虾IT笔记)
- 【Android】手机号码获取问题
手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码 ...