go语言实现 数据结构 图以及图的遍历

学习c++算法的时候到了图这里就卡住了,学go的时候又重新拿起了书,曾经回过头的南墙,有一天还是会想再撞一撞。

go语言实现 数据结构 图以及图的遍历

利用深度优先搜索来遍历图

package main

import "fmt"

var vertex = 5
var edge = 5
var sum int
var book[10]int
var arr[10][10]int

func dfs(n int){
    fmt.Println(n)
    sum++
    if sum == vertex {return}
    for i:=1; i<=vertex; i++ {
        if arr[n][i]==1 && book[i]==0 {
            book[i] = 1
            dfs(i)
        }
    }
}

func main(){
    var x , y int
    //初始化二维数组
    for i:=1; i<=vertex; i++    {
        for j:=1; j<=vertex; j++ {
            if i==j {
                arr[i][j]=0
            }else{
                arr[i][j]=9
            }
        }
    }
    //读入边
    for i:=1; i<=edge; i++ {
        fmt.Scan(&x,&y)
        arr[x][y]=1
        arr[y][x]=1
    }
    //从节点1开始遍历
    book[1]=1
    dfs(1)
}

go语言实现 数据结构 图以及图的遍历

用excel表格做了一个dfs函数运行过程的推导,深度优先搜索遍历的最终结果是1,2,4,3,5

递归版本的宽搜

package main

import "fmt"

var vertex = 5
var edge = 5
var tail = 1
var que[1001]int 
var book[10]int
var arr[10][10]int

func bfs(n int){
    if tail > vertex {return}
    for i:=1;i<=vertex;i++{
        if arr[que[n]][i] ==1 && book[i] ==0 {
            book[i]=1
            que[tail]=i
            tail++
        }
    }
    bfs(n+1)
}

func main(){
    var x , y int
    //初始化二维数组
    for i:=1; i<=vertex; i++    {
        for j:=1; j<=vertex; j++ {
            if i==j {
                arr[i][j]=0
            }else{
                arr[i][j]=9
            }
        }
    }
    //读入边
    for i:=1; i<=edge; i++ {
        fmt.Scan(&x,&y)
        arr[x][y]=1
        arr[y][x]=1
    }
    //从节点1开始遍历
    que[tail] =1
    tail++
    book[1]=1
    bfs(1)
    for i:=1;i<tail;i++{
        fmt.Println(que[i])
    }
}

非递归方式宽搜

package main

import "fmt"

const MAX = 100

var vertex = 5
var edge = 5
var que [MAX]int
var book [MAX]bool
var arr [MAX][MAX]int
var head = 1  // 队列头部
var tail = 1  // 队列尾部

func bfs() {
    for head < tail {
        for i := 1; i <= vertex; i++ {
            if arr[que[head]][i] == 1 && !book[i] {
                book[i] = true
                que[tail] = i
                tail++
            }
        }
        head++
    }
}

func main() {
    var x, y int
    
    // 初始化二维数组
    for i := 1; i <= vertex; i++ {
        for j := 1; j <= vertex; j++ {
            if i == j {
                arr[i][j] = 0
            } else {
                arr[i][j] = 9
            }
        }
    }
    
    // 读入边
    fmt.Println("请输入", edge, "条边:")
    for i := 1; i <= edge; i++ {
        fmt.Scan(&x, &y)
        arr[x][y] = 1
        arr[y][x] = 1
    }
    
    // 从节点1开始遍历
    que[tail] = 1  // que[1] = 1
    tail++         // tail = 2
    book[1] = true
    
    bfs()
    
    // 输出结果
    for i := 1; i < tail; i++ {
        fmt.Print(que[i], " ")
    }
    fmt.Println()
}

标签: go语言

移动端可扫我直达哦~

推荐阅读

thumbnail 2026-07-18

《go语言入门与精通》go语言中的命名规则

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母( Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的: hea...

少儿编程 go语言

thumbnail 2026-06-04

go语言gin框架的学习笔记

上半年尝试制作了一个微信小程序,通过小程序请求后台服务器,服务器负责组装好用户需求的mp3文件,然后返回给用户播放地址,以实现一个简单的听写功能。其中后台的逻辑基本都是通过deepseek实现的,虽然成功跑通了,但是一直想从头手搓一遍...

少儿编程 go语言

thumbnail 2026-06-02

提升读写性能,go语言的bufio包

最近在尝试学习go语言,想去洛谷做几道题吧,结果前几个答案是正确的,最后两个报了超时,标准输入输出fmt存在读写性能上的缺陷。deepseek推荐了这个bufio包。bufio 包的核心功能bufio 提供缓冲 I/O,通过减少系统调...

少儿编程 go语言

thumbnail 2026-05-30

fmt,Go 语言自带的格式化输入输出包

fmt 可以理解为 Format(格式)的缩写——因为它擅长格式化数据(比如把数字嵌进句子中间)。fmt 就是 Go 语言的"终端对话工具",让你能在屏幕上显示东西,也能从键盘获取输入。fmt包的常用指令 概念对应 fmt 函数标准输...

少儿编程 go语言

thumbnail 2026-05-27

乱点技能树之-go语言笔记篇

系统仍旧是廉颇老矣的windows7,所以很多软件的新版本都没法运行,就像go已经出到了1.26版本,但win7上仅支持1.20.14,再往上就不受支持了,所以下方的代表仅在上述版本中验证通过。学习go语言的第一感受是,go语言取消了...

少儿编程 go语言