lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

图是一种复杂的数据结构,它由顶点和边组成,可以表示任意两个数据元素之间的关系。

图有以下一些基本概念和术语:

  • 图可以分为无向图和有向图,根据边是否有方向。
  • 图可以分为简单图和多重图,根据边是否重复或自环。
  • 图可以分为完全图和非完全图,根据任意两个顶点之间是否存在边或弧。
  • 图可以分为稀疏图和稠密图,根据边或弧的数量相对于顶点的数量的比例。
  • 图可以分为网和非网,根据边或弧是否带有权值。
  • 图中的顶点之间可以是连通的或非连通的,根据是否存在从一个顶点到另一个顶点的路径。
  • 图中的连通子图称为连通分量,如果是有向图,则称为强连通分量。
  • 图中包含所有顶点且边数最少的连通子图称为生成树,如果是有向图,则称为有向树或生成森林。
  • 图中顶点的度是与该顶点相关联的边或弧的数量,如果是有向图,则分为入度和出度。
  • 图中路径的长度是路径上的边或弧的数量,如果是网,则还要考虑权值之和。

图有以下一些常用的存储结构和基本操作:

  • 邻接矩阵:用一个一维数组存储顶点信息,用一个二维数组存储边或弧的信息。邻接矩阵适合表示稠密图,但会浪费空间表示稀疏图。
  • 邻接表:用一个一维数组存储顶点信息,用一个链表数组存储每个顶点的邻接点信息。邻接表适合表示稀疏图,但会增加查找边或弧的时间。
  • 十字链表:用一个一维数组存储顶点信息,用一个链表数组存储每个顶点作为弧尾的出边信息和作为弧头的入边信息。十字链表适合表示稀疏的有向图,但会占用更多的空间。
  • 邻接多重表:用一个一维数组存储顶点信息,用一个链表数组存储每个顶点相关联的边信息,并在每条边上标记其方向。邻接多重表适合表示无向图中存在重复边或自环的情况,但会增加操作的复杂度。
  • 边集数组:用一个一维数组存储顶点信息,用一个二维数组存储边或弧信息,并在每条边或弧上标记其起点和终点。边集数组适合表示任意类型的图,但不便于查找某个顶点的邻接点。

图有以下一些常见的算法和应用:

  • 图的遍历:按照一定的规则访问图中所有顶点且每个顶点仅访问一次。常用的遍历方法有深度优先搜索(DFS)和广度优先搜索(BFS)。
  • 最小生成树:在一个连通网中找到一棵包含所有顶点且权值之和最小的生成树。常用的算法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。
  • 最短路径:在一个带权的有向图中找到从一个顶点到另一个顶点的路径,使得路径上的权值之和最小。常用的算法有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法。
  • 拓扑排序:在一个有向无环图中对所有顶点进行排序,使得对于任意一条弧<v,w>,顶点v总是排在顶点w之前。常用的算法有基于入度的拓扑排序算法和基于DFS的拓扑排序算法。
  • 关键路径:在一个表示工程项目的带权有向无环图中找到一条从起点到终点的路径,使得路径上的权值之和最大。这条路径就是工程项目的关键路径,表示工程项目的最短完成时间。常用的算法有基于拓扑排序的关键路径算法。
posted on 2023-07-18 22:01  白露~  阅读(13)  评论(0编辑  收藏  举报