Skip to content

Commit

Permalink
图论更新
Browse files Browse the repository at this point in the history
  • Loading branch information
youngyangyang04 committed Jun 13, 2024
1 parent 8fe3534 commit 96f4622
Show file tree
Hide file tree
Showing 37 changed files with 1,496 additions and 112 deletions.
3 changes: 0 additions & 3 deletions problems/0332.重新安排行程.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,6 @@ for (pair<const string, int>& target : targets[result[result.size() - 1]])

如果最终代码,发现照着回溯法模板画的话好像也能画出来,但难就难如何知道可以使用回溯,以及如果套进去,所以我再写了这么长的一篇来详细讲解。

就酱,很多录友表示和「代码随想录」相见恨晚,那么帮Carl宣传一波吧,让更多同学知道这里!



## 其他语言版本

Expand Down
30 changes: 28 additions & 2 deletions problems/kamacoder/0047.参会dijkstra堆.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# dijkstra(堆优化版)精讲

[题目链接](https://kamacoder.com/problempage.php?pid=1047)
[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047)

【题目描述】

Expand Down Expand Up @@ -66,7 +66,7 @@

如果n很大的话,我们可以换一个角度来优先性能。

在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)(从点的角度来求最小生成树)、[Kruskal算法](https://mp.weixin.qq.com/s/rUVaBjCES_4eSjngceT5bw)(从边的角度来求最小生成树)
在 讲解 最小生成树的时候,我们 讲了两个算法,[prim算法](./0053.寻宝-prim.md)(从点的角度来求最小生成树)、[Kruskal算法](./0053.寻宝-Kruskal.md)(从边的角度来求最小生成树)

这么在n 很大的时候,也有另一个思考维度,即:从边的数量出发。

Expand Down Expand Up @@ -649,3 +649,29 @@ int main() {



## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

36 changes: 31 additions & 5 deletions problems/kamacoder/0047.参会dijkstra朴素.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# dijkstra(朴素版)精讲

[题目链接](https://kamacoder.com/problempage.php?pid=1047)
[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047)

【题目描述】

Expand Down Expand Up @@ -80,7 +80,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点

最短路径的权值为12。

其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因)
其实 dijkstra 算法 和 我们之前讲解的prim算法思路非常接近,如果大家认真学过[prim算法](./0053.寻宝-prim.md),那么理解 Dijkstra 算法会相对容易很多。(这也是我要先讲prim再讲dijkstra的原因)

dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没有访问过的节点。

Expand All @@ -92,7 +92,7 @@ dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没

大家此时已经会发现,这和prim算法 怎么这么像呢。

我在[prim算法](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。
我在[prim算法](./0053.寻宝-prim.md)讲解中也给出了三部曲。 prim 和 dijkstra 确实很像,思路也是类似的,这一点我在后面还会详细来讲。

在dijkstra算法中,同样有一个数组很重要,起名为:minDist。

Expand Down Expand Up @@ -462,7 +462,7 @@ select:7

如果题目要求把最短路的路径打印出来,应该怎么办呢?

这里还是有一些“坑”的,本题打印路径和 prim 打印路径是一样的,我在 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) 【拓展】中 已经详细讲解了。
这里还是有一些“坑”的,本题打印路径和 prim 打印路径是一样的,我在 [prim算法精讲](./0053.寻宝-prim.md) 【拓展】中 已经详细讲解了。

在这里就不再赘述。

Expand Down Expand Up @@ -660,7 +660,7 @@ int main() {

## dijkstra与prim算法的区别

> 这里再次提示,需要先看我的 [prim算法精讲](https://mp.weixin.qq.com/s/yX936hHC6Z10K36Vm1Wl9w) ,否则可能不知道我下面讲的是什么。
> 这里再次提示,需要先看我的 [prim算法精讲](./0053.寻宝-prim.md) ,否则可能不知道我下面讲的是什么。
大家可以发现 dijkstra的代码看上去 怎么和 prim算法这么像呢。

Expand Down Expand Up @@ -731,3 +731,29 @@ for (int v = 1; v <= n; v++) {



## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

32 changes: 29 additions & 3 deletions problems/kamacoder/0053.寻宝-Kruskal.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ kruscal的思路:

**但在代码中,如果将两个节点加入同一个集合,又如何判断两个节点是否在同一个集合呢**

这里就涉及到我们之前讲解的[并查集](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)
这里就涉及到我们之前讲解的[并查集](./图论并查集理论基础.md)

我们在并查集开篇的时候就讲了,并查集主要就两个功能:

Expand All @@ -139,7 +139,7 @@ kruscal的思路:

大家发现这正好符合 Kruskal算法的需求,这也是为什么 **我要先讲并查集,再讲 Kruskal**

关于 并查集,我已经在[并查集精讲](https://www.programmercarl.com/%E5%9B%BE%E8%AE%BA%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html) 详细讲解过了,所以这里不再赘述,我们直接用。
关于 并查集,我已经在[并查集精讲](./图论并查集理论基础.md) 详细讲解过了,所以这里不再赘述,我们直接用。

本题代码如下,已经详细注释:

Expand Down Expand Up @@ -374,7 +374,7 @@ Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 K
在节点数量固定的情况下,图中的边越少,Kruskal 需要遍历的边也就越少。
而 prim 算法是对节点进行操作的,节点数量越少,prim算法效率就越少
而 prim 算法是对节点进行操作的,节点数量越少,prim算法效率就越优
所以在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。
Expand All @@ -398,3 +398,29 @@ Kruskal算法 时间复杂度 为 nlogn,其中n 为边的数量,适用稀疏
录友们可以细细体会。
## 其他语言版本
### Java
### Python
### Go
### Rust
### Javascript
### TypeScript
### PhP
### Swift
### Scala
### C#
### Dart
### C
28 changes: 27 additions & 1 deletion problems/kamacoder/0053.寻宝-prim.md
Original file line number Diff line number Diff line change
Expand Up @@ -507,10 +507,36 @@ int main() {

最后我们拓展了如何求职 最小生成树 的每一条边,其实 添加的代码很简单,主要是理解 为什么使用 parent数组 来记录边 以及 在哪里 更新parent数组。

同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导师结果被覆盖
同时,因为使用一维数组,数组的下标和数组 如何赋值很重要,不要搞反,导致结果被覆盖

好了,以上为总结,录友们学习愉快。




## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

26 changes: 26 additions & 0 deletions problems/kamacoder/0094.城市间货物运输I-SPFA.md
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,32 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹



## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C




Expand Down
26 changes: 26 additions & 0 deletions problems/kamacoder/0094.城市间货物运输I.md
Original file line number Diff line number Diff line change
Expand Up @@ -387,3 +387,29 @@ Bellman_ford 是可以计算 负权值的单源最短路算法。

弄清楚 什么是 松弛? 为什么要 n-1 次? 对理解Bellman_ford 非常重要。

## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

27 changes: 27 additions & 0 deletions problems/kamacoder/0095.城市间货物运输II.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,3 +238,30 @@ int main() {
}

```
## 其他语言版本
### Java
### Python
### Go
### Rust
### Javascript
### TypeScript
### PhP
### Swift
### Scala
### C#
### Dart
### C
27 changes: 27 additions & 0 deletions problems/kamacoder/0096.城市间货物运输III.md
Original file line number Diff line number Diff line change
Expand Up @@ -630,3 +630,30 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非
* 能否用dijkstra

学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。

## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

23 changes: 23 additions & 0 deletions problems/kamacoder/0097.小明逛公园.md
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,29 @@ floyd算法的时间复杂度相对较高,适合 稠密图且源点较多的
如果 源点少,其实可以 多次dijsktra 求源点到终点。


## 其他语言版本

### Java

### Python

### Go

### Rust

### Javascript

### TypeScript

### PhP

### Swift

### Scala

### C#

### Dart

### C

Loading

0 comments on commit 96f4622

Please sign in to comment.