mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-11-04 22:55:21 +08:00
添加kamacoder/0047.参会dijkstra朴素的Go版本
This commit is contained in:
@@ -865,6 +865,114 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
### Go
|
### 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
|
### Rust
|
||||||
|
|
||||||
### JavaScript
|
### JavaScript
|
||||||
|
|||||||
Reference in New Issue
Block a user