图论入门(一)

1 篇文章 0 订阅
  • 图的表示
    在这里插入图片描述
    线性结构:每一个节点指向下一个节点。
    树结构:每个节点有 左孩子 和 右孩子。线段树 堆 可以用数组表示
    图结构:
    顶点(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值