博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
floyd算法学习
阅读量:6271 次
发布时间:2019-06-22

本文共 1856 字,大约阅读时间需要 6 分钟。

hot3.png

1、问题引入

  带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以求得每一对顶点之间的最短路径,总的执行时间为O(n3)。

  这里可以采用另外一种求解算法:Floyd算法。

2、Floyd的基本思想为:

  从邻接矩阵a开始进行n次迭代,第一次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于1的顶点的最短路径长度;第k次迭代后a[i,j]的值是从vi到vj且中间不经过变化大于k的顶点的最短路径长度 第n次迭代后a[i,j]的值就是从vi到vj的最短路径长度。

3、算法描述:

  (1) 用数组d[i][j]来记录i,j之间的最短距离。初始化d[i][j],若i=j则d[i][j]=0,

    若i,j之间有边连接则d[i][j]的值为该边的权值,否则d[i][j]的值为max 。
  (2) 对所有的k值从1到n,修正任意两点之间的最短距离,计算d[i][k]+d[k][j]的值,
    若小于d[i][j],则d[i][j]= d[i][k]+d[k][j],否则d[i][j]的值不变。

4、具体实现:

  带权有向图如下:

在b.txt文件中保存的带权有向图的数据为:

其中第一个数据4表述图中有4个节点,其他的四行四列数据表示各个节点之间的路径长度,9999表示两个节点之间不可达。

import java.io.File;import java.io.FileNotFoundException;import java.util.Scanner;public class Floyd {	public static int N;	public static int[][] f;	public static int[][] path;		public static void floyd(){		int i,j,k;		i = j = k = 0;		for(i = 0; i < N; ++i)			for(j = 0; j < N; ++j)				for(k = 0; k < N; ++k)					if(f[i][j] > f[i][k] + f[k][j]){						f[i][j] = f[i][k] + f[k][j];						path[i][j] = k;					}		print();	}		public static void print(){		for(int i = 0; i < N; ++i){			for(int j = 0; j < N; ++j){				printPath(i, j);				System.out.print("="+f[i][j]+"\t");			}			System.out.println();		}	}		public static void printPath(int i, int j){		if(i == j || path[i][j] == -1)			System.out.print(i+"->"+j);		else{			printPath(i,path[i][j]);			System.out.print("->"+j);		}	}		public static void main(String[] args) {		String p = "d:/b.txt";		try {			Scanner s = new Scanner(new File(p));			while(s.hasNext()){				N = s.nextInt();				f = new int[N][N];				path = new int[N][N];				for(int i = 0; i < N; ++i){					for(int j =0; j < N; ++j){						f[i][j] = s.nextInt();						path[i][j] = -1;					}				}				floyd();			}		} catch (FileNotFoundException e) {			e.printStackTrace();		}	}}

转载于:https://my.oschina.net/u/1182234/blog/272735

你可能感兴趣的文章
CSS规范
查看>>
使用FastDateFormat来代替JDK自带的DateFormat
查看>>
Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
查看>>
Android源代码解析之(三)--&gt;异步任务AsyncTask
查看>>
(zhuan) 自然语言处理中的Attention Model:是什么及为什么
查看>>
C#中使用RabbitMQ收发队列消息
查看>>
Hadoop1.2.1 全然分布式集群搭建实操笔记
查看>>
第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
查看>>
MVC总结--MVC简单介绍以及和WebForm差别
查看>>
tiny4412 裸机程序 五、控制icache【转】
查看>>
VB.NET多线程入门
查看>>
国外物联网平台初探(二) ——微软Azure IoT
查看>>
findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)...
查看>>
Android事件分发机制源代码分析
查看>>
《设计模式》结构型模式
查看>>
[javase学习笔记]-8.3 statickeyword使用的注意细节
查看>>
Spring集成RabbitMQ-使用RabbitMQ更方便
查看>>
Nginx 设置域名转向配置
查看>>
.net core 实现简单爬虫—抓取博客园的博文列表
查看>>
FP-Tree算法的实现
查看>>