mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-02-02 18:39:09 +08:00
Merge pull request #2898 from HuangLM03/update-kamacoder/0047参会dijkstra朴素
添加kamacoder/0047.参会dijkstra朴素的Go版本
This commit is contained in:
@@ -114,7 +114,7 @@ dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没
|
||||
|
||||
### 模拟过程
|
||||
|
||||
-----------
|
||||
-----------
|
||||
|
||||
0、初始化
|
||||
|
||||
@@ -130,7 +130,7 @@ minDist数组数值初始化为int最大值。
|
||||
|
||||
此时所有节点都没有被访问过,所以 visited数组都为0
|
||||
|
||||
---------------
|
||||
---------------
|
||||
|
||||
以下为dijkstra 三部曲
|
||||
|
||||
@@ -555,13 +555,13 @@ int main() {
|
||||
|
||||
那我们来看dijkstra 求解的路径是什么样的,继续dijkstra 三部曲来模拟 :(dijkstra模拟过程上面已经详细讲过,以下只模拟重要过程,例如如何初始化就省略讲解了)
|
||||
|
||||
-----------
|
||||
-----------
|
||||
|
||||
初始化:
|
||||
|
||||

|
||||
|
||||
---------------
|
||||
---------------
|
||||
|
||||
1、选源点到哪个节点近且该节点未被访问过
|
||||
|
||||
@@ -632,7 +632,7 @@ int main() {
|
||||
|
||||
节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了
|
||||
|
||||
------------
|
||||
------------
|
||||
|
||||
1、选源点到哪个节点近且该节点未被访问过
|
||||
|
||||
@@ -646,7 +646,7 @@ int main() {
|
||||
|
||||

|
||||
|
||||
--------------
|
||||
--------------
|
||||
|
||||
至此dijkstra的模拟过程就结束了,根据最后的minDist数组,我们求 节点1 到 节点5 的最短路径的权值总和为 3,路径: 节点1 -> 节点3 -> 节点4 -> 节点5
|
||||
|
||||
@@ -865,6 +865,114 @@ if __name__ == "__main__":
|
||||
|
||||
### Go
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import(
|
||||
"fmt"
|
||||
"os"
|
||||
"bufio"
|
||||
"strconv"
|
||||
"strings"
|
||||
"math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建Reader从标准输入中读取数据
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
|
||||
// 以字符串的形式读取一行
|
||||
line, _ := reader.ReadString('\n')
|
||||
// 去掉字符串前后可能存在的空格
|
||||
line = strings.TrimSpace(line)
|
||||
// 以空格作为分隔符分割字符串,得到数字的字符串形式
|
||||
params := strings.Split(line, " ")
|
||||
// 字符串转化为数字,得到n和m,其中n为汽车站数,m为公路数
|
||||
n, _ := strconv.Atoi(params[0])
|
||||
m, _ := strconv.Atoi(params[1])
|
||||
|
||||
// 存储从源点到每个节点的最短距离
|
||||
minDist := initSliceInt(math.MaxInt32, n + 1)
|
||||
minDist[1] = 0
|
||||
// 记录顶点是否被访问过
|
||||
visited := initSliceBool(false, n + 1)
|
||||
|
||||
// 存储每个车站之间的距离
|
||||
grid := make([][]int, n + 1)
|
||||
for i := 1; i <= n; i++ {
|
||||
grid[i] = initSliceInt(math.MaxInt32, n + 1)
|
||||
grid[i][i] = 0
|
||||
}
|
||||
for i := 1; i <= m; i++ {
|
||||
line, _ = reader.ReadString('\n')
|
||||
line = strings.TrimSpace(line)
|
||||
params = strings.Split(line, " ")
|
||||
a, _ := strconv.Atoi(params[0])
|
||||
b, _ := strconv.Atoi(params[1])
|
||||
c, _ := strconv.Atoi(params[2])
|
||||
|
||||
grid[a][b] = c
|
||||
}
|
||||
|
||||
// Dijkstra算法
|
||||
for i := 1; i <= n; i++ {
|
||||
cur := -1
|
||||
// 1、选距离源点最近且未访问过的节点
|
||||
for j := 1; j <= n; j++ {
|
||||
if visited[j] == false && (cur == -1 || minDist[cur] > minDist[j]) {
|
||||
cur = j;
|
||||
}
|
||||
}
|
||||
|
||||
// 2、标记该节点已被访问
|
||||
visited[cur] = true
|
||||
|
||||
/*
|
||||
3、更新非访问节点到源点的距离(即更新minDist数组)。实际更新时无需判断
|
||||
节点是否被访问过,因为1.的限制,即使更新被访问过的点也没有任何影响。
|
||||
*/
|
||||
for j := 1; j <= n; j++ {
|
||||
minDist[j] = min(minDist[j], minDist[cur] + grid[cur][j])
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if minDist[n] == math.MaxInt32 {
|
||||
// 不能到达终点
|
||||
fmt.Print(-1)
|
||||
} else {
|
||||
// 到达终点最短路径
|
||||
fmt.Print(minDist[n])
|
||||
}
|
||||
}
|
||||
|
||||
// 创建int类型的切片
|
||||
func initSliceInt(value int, count int) []int {
|
||||
result := make([]int, count)
|
||||
for i := range result {
|
||||
result[i] = value
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// 创建bool类型的切片
|
||||
func initSliceBool(value bool, count int) []bool {
|
||||
result := make([]bool, count)
|
||||
for i := range result {
|
||||
result[i] = value
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// 比较两个int类型的大小,返回较小的一个
|
||||
func min(a, b int) int {
|
||||
if a > b {
|
||||
return b
|
||||
}
|
||||
return a
|
||||
}
|
||||
```
|
||||
|
||||
### Rust
|
||||
|
||||
### JavaScript
|
||||
|
||||
Reference in New Issue
Block a user