This commit is contained in:
Zengtudor 2024-08-26 20:42:14 +08:00
parent a7e16a135f
commit babd1d4fae
2 changed files with 83 additions and 0 deletions

View File

@ -79,6 +79,66 @@ $$
这意味着当 $ n $ 个顶点均匀地分配在两个子集中时,二分图能够包含最多的边。
## 14
迪杰斯特拉Dijkstra算法是一种用于计算单源最短路径的图算法。它可以找出从起始节点到其他所有节点的最短路径是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉Edsger W. Dijkstra于1956年提出的。
### 迪杰斯特拉算法的基本思想
1. **初始化**
- 从起点开始设定起点的距离为0其余所有节点的距离为无穷大。
- 将所有节点标记为未访问。
2. **选择节点**
- 从未访问的节点中选择一个距离起点最近的节点(称为当前节点)。
3. **更新距离**
- 以当前节点为中介,更新其邻居节点的距离。
- 如果通过当前节点可以使某个邻居节点的距离变得更短,则更新该邻居节点的距离值。
4. **标记已访问**
- 将当前节点标记为已访问,不再访问。
5. **重复步骤2至4**
- 继续选择未访问节点中距离最小的节点,重复更新操作,直到所有节点都被访问。
### 迪杰斯特拉算法的应用
迪杰斯特拉算法主要应用于以下场景:
- 网络路由:寻找最短路径以优化数据传输。
- 地图和导航系统:找出最短路径或最优路径。
- 资源管理:优化资源分配和调度。
### 伪代码
```plaintext
function Dijkstra(Graph, source):
dist[source] ← 0
for each vertex v in Graph:
if v ≠ source:
dist[v] ← INFINITY
add v to unvisitedSet
while unvisitedSet is not empty:
u ← vertex in unvisitedSet with min dist[u]
remove u from unvisitedSet
for each neighbor v of u:
alt ← dist[u] + length(u, v)
if alt < dist[v]:
dist[v] ← alt
return dist
```
### 复杂度
迪杰斯特拉算法的时间复杂度取决于实现方式。使用优先队列(二叉堆)实现的情况下,时间复杂度为 $O((V + E) \log V)$,其中 $V$ 是节点数,$E$ 是边数。
如果你有任何具体问题或者需要更详细的解释,请告诉我!
# 编程选择题
## 2
@ -179,6 +239,14 @@ int main() {
### 总结
这份代码针对性地说,单调递增是$O(n \log n)$
虽然快速选择算法在随机数据或一般情况下具有 `O(n)` 的平均时间复杂度,但在输入数据是**单调递增**或**单调递减**且每次选择的枢轴都很不理想(例如总是选到最小或最大值)时,算法可能退化到最坏的情况,时间复杂度变为 `O(n^2)`
要改善这种情况,可以采用随机化策略选择枢轴(如现在代码中所做的)或者使用“三点取中”的方式选择枢轴,以减少最坏情况发生的概率,从而保证算法的效率。
# 完善程序
## 分数背包
> 辗转相除法最大公约数名曰gcd

15
20240826/计划.md Normal file
View File

@ -0,0 +1,15 @@
# 2024年8月26日~8月31日安排
## 每日训练
### 初赛题目
> 由于初赛本省难度较高,所以优先攻克初赛,每天写一套初赛题目
### 《算法竞赛·进阶指南》
有八大块内容争取5天线浏览一遍有初步印象对复赛和初赛都有帮助
### 《信息学奥赛·一本通》
此书主要讲解初赛内容5天内阅读并理解为初赛打好基础