Skip to content

Commit f802fc7

Browse files
committed
添加kamacoder/0047.参会dijkstra朴素的Go版本
1 parent e3a007f commit f802fc7

File tree

1 file changed

+114
-6
lines changed

1 file changed

+114
-6
lines changed

problems/kamacoder/0047.参会dijkstra朴素.md

Lines changed: 114 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ dijkstra 算法 同样是贪心的思路,不断寻找距离 源点最近的没
114114

115115
### 模拟过程
116116

117-
-----------
117+
-----------
118118

119119
0、初始化
120120

@@ -130,7 +130,7 @@ minDist数组数值初始化为int最大值。
130130

131131
此时所有节点都没有被访问过,所以 visited数组都为0
132132

133-
---------------
133+
---------------
134134

135135
以下为dijkstra 三部曲
136136

@@ -555,13 +555,13 @@ int main() {
555555

556556
那我们来看dijkstra 求解的路径是什么样的,继续dijkstra 三部曲来模拟 :(dijkstra模拟过程上面已经详细讲过,以下只模拟重要过程,例如如何初始化就省略讲解了)
557557

558-
-----------
558+
-----------
559559

560560
初始化:
561561

562562
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227104801.png)
563563

564-
---------------
564+
---------------
565565

566566
1、选源点到哪个节点近且该节点未被访问过
567567

@@ -632,7 +632,7 @@ int main() {
632632

633633
节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了
634634

635-
------------
635+
------------
636636

637637
1、选源点到哪个节点近且该节点未被访问过
638638

@@ -646,7 +646,7 @@ int main() {
646646

647647
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240227110711.png)
648648

649-
--------------
649+
--------------
650650

651651
至此dijkstra的模拟过程就结束了,根据最后的minDist数组,我们求 节点1 到 节点5 的最短路径的权值总和为 3,路径: 节点1 -> 节点3 -> 节点4 -> 节点5
652652

@@ -865,6 +865,114 @@ if __name__ == "__main__":
865865

866866
### Go
867867

868+
```go
869+
package main
870+
871+
import(
872+
"fmt"
873+
"os"
874+
"bufio"
875+
"strconv"
876+
"strings"
877+
"math"
878+
)
879+
880+
func main() {
881+
// 创建Reader从标准输入中读取数据
882+
reader := bufio.NewReader(os.Stdin)
883+
884+
// 以字符串的形式读取一行
885+
line, _ := reader.ReadString('\n')
886+
// 去掉字符串前后可能存在的空格
887+
line = strings.TrimSpace(line)
888+
// 以空格作为分隔符分割字符串,得到数字的字符串形式
889+
params := strings.Split(line, " ")
890+
// 字符串转化为数字,得到n和m,其中n为汽车站数,m为公路数
891+
n, _ := strconv.Atoi(params[0])
892+
m, _ := strconv.Atoi(params[1])
893+
894+
// 存储从源点到每个节点的最短距离
895+
minDist := initSliceInt(math.MaxInt32, n + 1)
896+
minDist[1] = 0
897+
// 记录顶点是否被访问过
898+
visited := initSliceBool(false, n + 1)
899+
900+
// 存储每个车站之间的距离
901+
grid := make([][]int, n + 1)
902+
for i := 1; i <= n; i++ {
903+
grid[i] = initSliceInt(math.MaxInt32, n + 1)
904+
grid[i][i] = 0
905+
}
906+
for i := 1; i <= m; i++ {
907+
line, _ = reader.ReadString('\n')
908+
line = strings.TrimSpace(line)
909+
params = strings.Split(line, " ")
910+
a, _ := strconv.Atoi(params[0])
911+
b, _ := strconv.Atoi(params[1])
912+
c, _ := strconv.Atoi(params[2])
913+
914+
grid[a][b] = c
915+
}
916+
917+
// Dijkstra算法
918+
for i := 1; i <= n; i++ {
919+
cur := -1
920+
// 1、选距离源点最近且未访问过的节点
921+
for j := 1; j <= n; j++ {
922+
if visited[j] == false && (cur == -1 || minDist[cur] > minDist[j]) {
923+
cur = j;
924+
}
925+
}
926+
927+
// 2、标记该节点已被访问
928+
visited[cur] = true
929+
930+
/*
931+
3、更新非访问节点到源点的距离(即更新minDist数组)。实际更新时无需判断
932+
节点是否被访问过,因为1.的限制,即使更新被访问过的点也没有任何影响。
933+
*/
934+
for j := 1; j <= n; j++ {
935+
minDist[j] = min(minDist[j], minDist[cur] + grid[cur][j])
936+
}
937+
938+
}
939+
940+
if minDist[n] == math.MaxInt32 {
941+
// 不能到达终点
942+
fmt.Print(-1)
943+
} else {
944+
// 到达终点最短路径
945+
fmt.Print(minDist[n])
946+
}
947+
}
948+
949+
// 创建int类型的切片
950+
func initSliceInt(value int, count int) []int {
951+
result := make([]int, count)
952+
for i := range result {
953+
result[i] = value
954+
}
955+
return result
956+
}
957+
958+
// 创建bool类型的切片
959+
func initSliceBool(value bool, count int) []bool {
960+
result := make([]bool, count)
961+
for i := range result {
962+
result[i] = value
963+
}
964+
return result
965+
}
966+
967+
// 比较两个int类型的大小,返回较小的一个
968+
func min(a, b int) int {
969+
if a > b {
970+
return b
971+
}
972+
return a
973+
}
974+
```
975+
868976
### Rust
869977

870978
### JavaScript

0 commit comments

Comments
 (0)