Day57 - 图论 Part07

36 阅读1分钟

基础

最小生成树:

用权值和最小的边形成的图就是 最小生成树

prim算法: (适合稠密图,点多边少,可以使用邻接矩阵存储)

prim算法使用贪心的思路每次寻找最小的距离(权值)最终形成最小生成树

prim算法三部曲:

  1. 选择距离最小生成树最近的 非最小生成树节点
  2. 加入最小生成树
  3. 更新非生成树节点 到 生成树的最小距离 (更新minDist数组)

kruskal 算法: (适合稀疏图,点少变多)

kruskal算法使用贪心的思路,将边进行排序,每次寻找 最短的距离(边的权值),最终形成最小生成树

kruskal思路:

  1. 将边按照权值排序,每次选择最小的权值
  2. 判断边的两端节点是否在同一集合
    • 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
    • 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合

刷题

  1. 寻宝

kamacoder.com/problempage…

Prim算法

image.png

Kruskal算法

image.png

总结

int32最大值

maxInt32 := math.MaxInt32

sort方法

func Slice added in go1.8

func Slice(x any, less func(i, j int) bool)

示例代码:

import (
	"fmt"
	"sort"
)

func main() {
	people := []struct {
		Name string
		Age  int
	}{
		{"Gopher", 7},
		{"Alice", 55},
		{"Vera", 24},
		{"Bob", 75},
	}
	sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
	fmt.Println("By name:", people)

	sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })
	fmt.Println("By age:", people)
}