- 图的表示
线性结构:每一个节点指向下一个节点。
树结构:每个节点有 左孩子 和 右孩子。线段树 堆 可以用数组表示
图结构:
顶点(Vertex) 顶点代表 物理或抽象的对象
边(Edge) 各顶点之间的互相连接
无向图(Undirected Graph) 表示连接之间 只是单独的联系。
有权值:关系之间的属性比重。
有向图(Directed Graph) :节点之间有上下级 所属的关系等抽象关系。
无向 | 有向 | |
---|---|---|
无权 | 无向无权图 | 有向无权图 |
有权 | 无向有前途 | 有向有权图 |
在这里插入代码片
无向无权图
- 两点相邻:一个点和他相邻的点
- 点的临边:一个点相邻的几条边
- 路径Path:从一点到另一点的路径
- 自环边:自己和自己相连形成一条边
- 平行边:有多条相同边
没有自环边,没有平行边,称为简单图。
联通分量:一个图中互相可以到达的所有节点构成一个联通分量 。
树是一种无环图 但 无环图不一定就是树
一个连通图 一定有有生成树 。
图的两种表示方法
讲一个文件加载成 矩阵图形式
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
"strconv"
"strings"
)
func main(){
AdjMatrix("g.txt")
}
type graph struct {
V int
E int
adj [][]int
}
var b graph
func AdjMatrix(filename string){
_,b,c,d := ReadLine(filename)
println(b,c)
for _,ab := range d{
for _,cao := range ab{
fmt.Printf("%d ",cao)
}
fmt.Println()
}
fmt.Println("======")
}
func ReadLine(filePth string) (error,int,int,[][]int) {
var arr [][]int
var V int
var E int
f, err := os.Open(filePth)
if err != nil {
return err,0,0,nil
}
defer f.Close()
bfRd := bufio.NewReader(f)
i:= 0
for {
line, err := bfRd.ReadBytes('\n')
if(len(line) ==0){
break
}
var str string = string(line[:len(line) -1])
strs :=strings.Split(str," ")
if(i == 0){
//var adj [][]int
V, _ =strconv.Atoi(strs[0])
if(V <= 0){
return nil, 0, 0, nil
}
E, _ =strconv.Atoi(strs[1])
for i:=0;i<V;i ++{
arrtmp := make([] int,V,V)
arr =append(arr,arrtmp)
}
}else {
node1, _ := strconv.Atoi(strs[0])
node2, _ := strconv.Atoi(strs[1])
arr[node1][node2] = 1
arr[node2][node1] = 1
//int1, _ :=strconv.Atoi(strs[1])
//arr[i] = ax
}
if err != nil { //遇到任何错误立即返回,并忽略 EOF 错误信息
if err == io.EOF {
return err,0,0,nil
}
return err,0,0,nil
}
i++
}
return nil,V,E,arr
}
func ReadAll(filepath string)([]byte ,error){
f,err := os.Open(filepath)
if err!= nil{
return nil,err
}
return ioutil.ReadAll(f)
}
文件内容如下
7 9
0 1
0 3
1 2
1 6
2 3
2 5
3 4
4 5
5 6