重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]
前言
佛洛伊德算法和迪杰斯特拉算法非常像,但是它求的是任何一个点到其他点之间的距离。
假设有一张图:

转换为矩阵为:

他们的前驱为:

可能上面表述前驱不清楚,举个例子。
看下图:


这第二种图表示,从A 经过A 到B,B点的前驱是A,他们的长度是5,红框中的数表示是A经过的点。
现在A到不了D,A经过A到D就是N,表示无限大。
所以我们需要更新数据,得到最优解。
解法如下:

举个例子,原始图是A通过A到B的距离。
那么可以尝试这样,让所以的点经过A到达其他的点,他们的距离是否更短。如图:

以此类推其他。
正文
代码:
static void Main(string[] args)
{
// 测试看看图是否创建成功
char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
//创建邻接矩阵
int N = 65535;
int[,] matrix = {
{ 0, 5, 7, N, N, N, 2 },
{ 5, 0, N, 9, N, N, 3 },
{ 7, N, 0, N, 8, N, N },
{ N, 9, N, 0, N, 4, N },
{ N, N, 8, N, 0, 5, 4 },
{ N, N, N, 4, 5, 0, 6 },
{ 2, 3, N, N, 4, 6, 0 }};
GraphFoy graph = new GraphFoy(matrix, vertex);
graph.floyd();
graph.show();
Console.Read();
}
}
class GraphFoy {
private char[] vertex;
private int[,] dis;
private int[,] pre;
public GraphFoy(int[,] matrix,char[] vertex)
{
this.vertex = vertex;
this.dis = matrix;
this.pre = new int[vertex.Length,vertex.Length];
for (int i=0;i<vertex.Length;i++)
{
for (int j=0;j<vertex.Length;j++)
{
this.pre[i, j] = i;
}
}
}
// 显示pre数组和dis数组
public void show()
{
//为了显示便于阅读,我们优化一下输出
char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
for (int k = 0; k < vertex.Length; k++)
{
// 先将pre数组输出的一行
for (int i = 0; i < vertex.Length; i++)
{
Console.Write(vertex[pre[k,i]] + " ");
}
Console.WriteLine();
// 输出dis数组的一行数据
for (int i = 0; i < vertex.Length; i++)
{
Console.Write("(" + vertex[k] + "到" + vertex[i] + "的最短路径是" + dis[k,i] + ") ");
}
Console.WriteLine();
}
}
public void floyd()
{
int len = 0;
for (int k = 0; k < vertex.Length; k++)
{
for (int i = 0; i < vertex.Length; i++)
{
for (int j = 0; j < vertex.Length; j++)
{
len = dis[k, i] + dis[k, j];
if (len<dis[i,j])
{
dis[i, j] = len;
pre[i, j] = pre[k, j];
//pre[i,j]=pre[k,j];
}
}
}
}
}
结果如下:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]的更多相关文章
- COJ968 WZJ的数据结构(负三十二)
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...
- [COJ0968]WZJ的数据结构(负三十二)
[COJ0968]WZJ的数据结构(负三十二) 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有一盏灯,初始均亮着.请你设计一个数据结构,回答M次操作. 1 x:将节点x上的灯拉一次,即亮变 ...
- 数据结构算法C语言实现(三十二)--- 9.1静态查找表
一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...
- (floyd)佛洛伊德算法
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业
(a) 建立一个有向图G(V,E),每个顶点表示一种货币,两个顶点之间的边权的大小ex[u][v]表示两种货币之间的汇率,若要找一个最有利的兑换序列,把货币s兑换成货币t,即在若干种兑换序列中选择 ...
- SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化
二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL ...
- 算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树
搜索树数据结构支持很多动态集合操作,如search(查找).minmum(最小元素).maxmum(最大元素).predecessor(前驱).successor(后继).insert(插入).del ...
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼
https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html #include< ...
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 【完全背包问题】
https://vjudge.net/contest/68966#problem/F http://blog.csdn.net/libin56842/article/details/9048173 # ...
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!
https://vjudge.net/contest/68966#problem/E http://blog.csdn.net/to_be_better/article/details/5056334 ...
随机推荐
- 使用go语言开发自动化API测试工具
前言 上一篇文章说到我还开发了一个独立的自动测试工具,可以根据 OpenAPI 的文档来测试,并且在测试完成后输出测试报告,报告内容包括每个接口是否测试通过和响应时间等. 这个工具我使用了 go 语言 ...
- Openssl命令详解 - 密钥篇
非对称算法密钥生成和公钥提取 # ecc算法 openssl ecparam -out pri.key -name prime256v1 -genkey #生成ec密钥,国密使用-name SM2 o ...
- sqlserver 查看执行计划
-- 清除执行计划缓存 DBCC FREEPROCCACHE -- 查看缓存执行计划 SELECT * FROM sys.dm_exec_cached_plans as p CROSS APPLY s ...
- Prometheus技术分享——如何监控宿主机和容器
这一期主要来跟大家聊一下,使用node_exporter工具来暴露主机和因公程序上的指标,利用prometheus来监控宿主机:以及通过通过Cadvisor监控docker容器. 一.部署node_e ...
- Vite-vue3 架构设计
Vite-vue3 架构设计 基础信息 Gitee项目地址:https://gitee.com/pengchenggang/vite-vue3 1 创建vite-vue3 初始化脚本 $ npm in ...
- Idea编译/运行Java程序慢
修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...
- 泰凌微2.4G无线私有协议芯片开发总结
案例 近些年,团队一直围绕着无线这块来做产品方案.一个无意的举动,接触到了泰凌微的2.4G私有协议芯片,发现这颗芯片在好几个场景中使用非常合适.就把这个芯片推荐给了客户,经过几个案子的历练.积 ...
- C++类的访问权限
首先明确一个类的用户有三种: 一类用户:类的成员和友元 二类用户:子类的成员及子类的友元 三类用户:外部的用户代码(通过类的对象或指针) 一个类有三种成员 private:只有一类用户可以访问priv ...
- Android 开发day1
下载了安卓开发软件 Android studio 下载过程中遇到了,C盘默认安装路径不匹配问题,因为我的系统文件是中文的,软件是国外的软件,导致了他不让我安装,我还是最后在C盘创建了一个文件后,直接安 ...
- 记录--for in 和 for of的区别详解以及为for in的输出顺序
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { ...