博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Floyd 基础知识
阅读量:4967 次
发布时间:2019-06-12

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

来自  

Floyed求多源最短路

算法过程

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);

 

for(int k = 1; k <= n; k++)	for(int i = 1; i <= n; i++)		for(int j = 1; j <= n; j++)			if(map[i][j] > map[i][k] + map[k][j])				map[i][j] = map[i][k] + map[k][j];

 

 

Floyed求传递闭包

 

     下面给出传递闭包的定义

有向图的传递闭包表达的就是每个顶点之间的可达性。

其实朴素的Floyd传递闭包就是求两点的可达性

使用Floyd是并不是因为它复杂度低。。

而是因为它比较好写。。。
常数小。。。

for(int k=1;k<=n;k++)    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            map[i][j] = map[i][j]|(map[i][k]&map[k][j]);

 

对应裸题:POJ3660 Cow Contest:

由于传递闭包的时间复杂度为n^3,那么当数据n=1000的时候会超时,这时可以想到用bitset优化,这时用bitset优化后的Floyd求传递闭包的时间复杂度将变成n^3/64

(64位的机子下)  这样将可以成功。

对应裸题:POJ3275 Ranking the Cows : 

 

 

Floyed求最小环

主要过程:

Floyd 算法是按照顶点的编号增加的顺序更新最短路径的,如果存在最小环,则会在这个环中的点编号最大的那个点 k 更新最短路径之前发现这个环, 即当点u被拿来更新i到j的最短路径的时候,可以发现这个闭合环路,发现的方法是,更新最短路径前有   dist[i][j] + map[i][k] + map[k][j] != inf    这时 s 的 i 和 j 是当前环中挨着点u的两个点; 因为在之前的最短路径更新过程中, k 没有参与更新,所以 dist[i][j] 所表示的路径中不会有点 k ,即一定为一个环; 如果在每个新的点拿来更新最短路径之前遍历i和j验证上面的式子,虽然不能遍历到所有的环; 但是由于 dist[i][j] 是 i 到 j 点的最短路径所以肯定可以遍历到最小的环;

 

int map[MAXS][MAXS], dis[MAXS][MAXS];	// 返回值为最小环权值。	int Floyd(int n)	{		int minCircle = INF; // 改进后的Floyd可求最小环。 minCircle用于记录最小环权值。		for(int k = 0; k < n; k ++)		{			// 改进部分 求最小环权值。			for(int i = 0; i < k; i ++)				for(int j = 0; j < i;j ++)					minCircle = min(minCircle, dis[i][j] + map[i][k] + map[k][j]);			// 通常部分。			for(int i = 0; i < n; i ++)				for(int j = 0; j < i; j ++)					if(dis[i][j] > dis[i][k] + dis[k][j])						dis[i][j] = dis[j][i] = dis[i][k] + dis[k][j];		}		return minCircle;	}
对应裸题:洛谷P2738 [USACO4.1]篱笆回路Fence Loops:

转载于:https://www.cnblogs.com/wjhstudy/p/9757053.html

你可能感兴趣的文章
前端利器躬行记(6)——Fiddler
查看>>
每次阅读外文技术资料都头疼,终于知道原因了。
查看>>
zabbix短信网关调用问题总结
查看>>
130242014034-林伟领-实验一
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Windows server 2008 R2中安装MySQL !
查看>>
Intellij Idea新建web项目(转)
查看>>
raspberry 安装apache2,使其支持ssl ,并创建自签名证书
查看>>
Trie树:应用于统计和排序
查看>>
C语言结构体和函数
查看>>
[BZOJ3449] [Usaco2014 Feb]Secret Code
查看>>
XHTML与HTML区别
查看>>
软考-程序设计语言基础(编译原理)
查看>>
2016峰会:项目管理与高级项目管理(广州站)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
linux 命令之top
查看>>
有关远程设置的问题
查看>>
BZOJ 1800: [Ahoi2009]fly 飞行棋
查看>>
2019,2月份第三个星期,js小突破了一波,笔记
查看>>
洛谷 [P3033] 牛的障碍
查看>>