图论基础和表示

图论基础和表示

以下参考菜鸟教程

一、基础概念

图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。

图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge)组成。

图的顶点集合不能为空,但边的集合可以为空。图可能是无向的,这意味着图中的边在连接顶点时无需区分方向。否则,称图是有向的。

图的分类:无权图和有权图,连接节点与节点的边是否有数值与之对应,有的话就是有权图,否则就是无权图。

图的连通性:在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点 i 到顶点 j 有路径相连(当然从j到i也一定有路径),则称 i 和 j 是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。图的连通性是图的基本性质。

完全图:完全是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。

自环边:一条边的起点终点是一个点。

平行边:两个顶点之间存在多条边相连接。

二、基本应用

图可用于在物理、生物、社会和信息系统中建模许多类型的关系和过程,许多实际问题可以用图来表示。因此,图论成为运筹学、控制论、信息论、网络理论、博弈论、物理学、化学、生物学、社会科学、语言学、计算机科学等众多学科强有力的数学工具。在强调其应用于现实世界的系统时,网络有时被定义为一个图,其中属性(例如名称)之间的关系以节点和或边的形式关联起来。

三、图的表达形式

邻接矩阵:1 表示相连接,0 表示不相连。

邻接表:只表达和顶点相连接的顶点信息

邻接表适合表示稀疏图 (Sparse Graph)

邻接矩阵适合表示稠密图 (Dense Graph)

四、邻接矩阵和邻接表的代码示例

1、邻接矩阵

class DenseGraph(object):
    def __init__(self, vertex, edge, directed):
        #节点数
        self.vertex = vertex
        #边数
        self.edge = edge
        #是否有向图
        self.directed = directed
        #图的具体数据, 初始化为Fasle, 无任何边
        self.graph = [[False] * vertex for _ in range(vertex)]
    
    def getVertexNum(self):
        """获取节点个数"""
        return self.vertex
    
    def getEdgeNum(self):
        """获取边的个数"""
        return self.edge
    
    def addEdge(self, v, w):
        """向图中添加一个便"""
        assert v >= 0 and v < self.vertex
        assert w >= 0 and w < self.vertex
        #如果已经存在边了,直接返回
        if self.hasEdge(v, w):
            return
        self.graph[v][w] = True
        #非有向图, 双向的
        if not self.directed:
            self.graph[w][v] = True
        #边数加1
        self.edge += 1
    
    def hasEdge(self, v, w):
        """判断图中是否有从v到w的边"""
        assert v >= 0 and v < self.vertex
        assert w >= 0 and w < self.vertex
        return self.graph[v][w]

2、邻接表

class SparseGraph(object):
    def __init__(self, vertex, edge, directed):
        #节点数
        self.vertex = vertex
        #边数
        self
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值