- 路径
- 最短路
- 有向图中的最短路、无向图中的最短路
- 单源最短路、每对结点之间的最短路
对于边权为正的图,任意两个结点之间的最短路,不会经过重复的结点。
对于边权为正的图,任意两个结点之间的最短路,不会经过重复的边。
对于边权为正的图,任意两个结点之间的最短路,任意一条的结点数不会超过 n n n ,边数不会超过 n − 1 n-1 n−1 。
二、最短路算法与模板 1.Floyd–适用于无负环图的最短路算法- 用于求解图中任意两点间的最短路径
- 时间复杂度 O ( N 3 ) O(N^3) O(N3),空间复杂度 O ( N 3 ) O(N^3) O(N3)(一维不优化) / 0 ( N 2 ) 0(N^2) 0(N2) (一维优化后);
- 容易实现,且适用于一切无负环且存在最短路的图,无论有向无向、边权正负。
我们定义一个数组 f[k][x][y]
,表示只允许经过结点
1
1
1 到
k
k
k ,结点
x
x
x 到结点
y
y
y 的最短路长度。
很显然, f[n][x][y]
就是结点
x
x
x 到结点
y
y
y 的最短路长度。
我们来考虑怎么求这个数组
f[0][x][y]
:边权,或者
0
0
0 ,或者
+
∞
+\infty
+∞ ( f[0][x][x]
什么时候应该是
+
∞
+\infty
+∞ ?)
f[k][x][y] = min(f[k-1][x][y], f[k-1][x][k]+f[k-1][k][y])
上面两行都显然是对的,然而这个做法空间是 O ( N 3 ) O(N^3) O(N3) 。
但我们发现数组的第一维是没有用的,于是可以直接改成 f[x][y] = min(f[x][y], f[x][k]+f[k][y])
,
for (k = 1; k b;
q.push(a);
ans[a] = 100.0;
while(!q.empty()){
int now = q.front();
for(int i = 0; i ans[now] / fee[now][i]){
ans[g[now][i]] = ans[now] / fee[now][i];
q.push(g[now][i]);
}
}
q.pop();
}
printf("%.8lf", ans[b]);
return 0;
}
[USACO07OCT]Obstacle Course S
Problem Description
Consider an N x N (1
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?