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 ...
随机推荐
- 树莓派高级GPIO库,wiringpi2 for python使用笔记(一)安装
网上的教程,一般Python用RPi.GPIO来控制树莓派的GPIO,而C/C++一般用wringpi库来操作GPIO,RPi.GPIO过于简单,很多高级功能不支持,比如i2c/SPI库等,也缺乏高精 ...
- Eclipse启动后一直Initializing Java Tooling (1%)
问题症状: 工作中eclipse崩溃,再次启动后cpu占用99%,状态栏一直显示Initializing Java Tooling: (1%). 解决方案: 删除\workspace\.metadat ...
- 升级automake和autoconf
<pre name="code" class="html">zjtest7-redis:/root/soft/json-c-json-c-0.12- ...
- 翻纸牌游戏(dfs回溯)
翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- 关于js封装框架类库之DOM操作模块(一)
在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 ...
- Android:广播接收器(BroadCastReceiver)要点随笔。
@@@描述 广播接收器可以收到 Context.sendBroadcast或者Context.sendOrderedBroadcast发出的意图(intent). @@@Local ...
- jQuery相关面试题
1 你在公司是怎么用jquery的? 答:在项目中是怎么用的是看看你有没有项目经验(根据自己的实际情况来回答) 你用过的选择器啊,复选框啊,表单啊,ajax啊,事件等 配置Jquery环境 下载jqu ...
- C++数组与指针
指向数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中) ...
- 建造者模式->代码示例
<?php interface Builder{ public function head(); public function body(); public function foot(); ...
- https tomcat 证书搭建
首先生成证书说明 keytool -genkey -alias castest -keyalg RSA -keystore c:/keys/caskey 先让输入密码,密码必须记住,下面会用到 其中“ ...