- 路径
- 最短路
- 有向图中的最短路、无向图中的最短路
- 单源最短路、每对结点之间的最短路
对于边权为正的图,任意两个结点之间的最短路,不会经过重复的结点。
对于边权为正的图,任意两个结点之间的最短路,不会经过重复的边。
对于边权为正的图,任意两个结点之间的最短路,任意一条的结点数不会超过 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
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence