数据结构(八)图

定义

定义解释

下图就是一张典型的图

图术语定义

无向边:若顶点vi到vj之间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)来表示

无向图:图内任意两个顶点之间的边都没有方向

有向边:顶点vi到vj的边有方向,也称为弧,用有序偶<vi,vj>表示,vi表示弧尾,vj表示弧头

有向图:图内任意两个顶点之间的边都是有向边

无向完全图:在无向图中,任意两个顶点之间都存在边。完全图有Cn2条边

有向完全图:在有向图中,任意两个顶点都存在互为相反的两条弧

子图:假设两个图 G=(V,{E}) 和 G‘=(V‘,{E‘}),如果 V’ 属于 V 并且 E‘ 属于 E,则称 G’ 为 G 的子图

无向图顶点的度:和顶点关联边的数目

有向图 入度:顶点为头的弧的数目

有向图 出度:顶点为尾的弧的数目

注意

连通图术语

定义

连通分量:无向图中的极大连通子图

连通分量特点:

图的存储结构

1.邻接矩阵

带权的图(网)

不适用于边数相对于顶点数较少的图

2.邻接表

数组和链表相结合,数组存放顶点,链表记录顶点之间的边或弧

对于有向图,有时候会采用逆邻接表,为了更直观得到入度信息

十字链表

把邻接表和逆邻接表结合起来

例如

看图可能有点乱,其实边表结构就是存放了[弧头,弧尾,指向下一个弧头,指向下一个弧尾],结构交叉,故名为十字链表

邻接多重链表

十字链表关注的是有向图,邻接多重链表关注的是无向图,参考十字链表的边表结构

边集数组

边信息数组

例如

图的遍历

定义

从图中某一个顶点出发遍历其余顶点,且每个顶点只被遍历到一次,这一过程就叫做图的遍历

深度优先遍历(DFS depth first search)

类似树的先序遍历方法

广度优先遍历(BFS breadth first search)

类似树的层序遍历

时间复杂度和深度优先遍历是一样的

最小生成树

构造连通网的最小代价生成树称为最小生成树

如何在图中找到最小生成树呢

普里姆算法和克鲁斯卡尔算法

普利姆算法(prim)

时间复杂度为O(n2)

克鲁斯卡尔(kruskal)

时间复杂度为O(eloge)

最短路径

迪杰斯特拉算法(Dijkstra)

时间复杂度O(n三次方)

费罗伊德算法(Flovd)

时间复杂度O(n三次方)

总结

以顺序表和链表两种表为基础,针对有向图和无向图的存储结构

时间: 2025-01-31 04:12:59

数据结构(八)图的相关文章

数据结构:图的实现--邻接矩阵

图结构的邻接矩阵实现 为了表现图中顶点之间的关联,我们可以使用邻接矩阵来实现图结构.所谓的邻接矩阵,就是一个反应边与边之间联系的二维数组.这个二维数组我们用matrix[numV][numV]表示,其中numV是顶点数. 对于无权图 若顶点Vi和Vj之间有边,则matrix[Vi][Vj]=1;否则matrix[Vi][Vj]=0. 对于有权图 若顶点Vi和Vj之间有边,且权值为weight,则matrix[Vi][Vj]=weight;否则matrix[Vi][Vj]=0或MAXWEIGHT(

数据结构之图 Part2 - 1

邻接矩阵 网上很少有C# 写图的数据结构的例子,实际的项目中也从来没用过Array 这坨东西,随手写个,勿喷. namespace LH.GraphConsole { public struct Graph { public Graph(int vertexNumber, int edgeNumber) { VertexNumber = vertexNumber; EdgeNumber = edgeNumber; Vertexs = new string[VertexNumber]; Edges

数据结构之图 Part1

Part 1 预计使用7天的时间来过掉图相关的数据结构.第一天主要是一天图的基本概念,熟练掌握定义是一切交流和沟通的基础. 1定义 1.1图 有穷非空顶点,外加边. G(V,E) Graph Vertex Edge 顶点就是 点,有穷非空. 顶点之间的关系就是边,边可空. 1.2 分类 无向边:无方向的边. 有向边:有方向的边,弧. 简单图:无重复边和自己到自己的顶点. 带权的图称为网. 无向图的度:顶点的边数. 有向图的度:顶点的弧的数量分为入度和出度. 连通图:任意两点有路径. 生成树:无向

数据结构:图--拓扑排序

拓扑排序 拓扑排序 在实际应用中,有向图的边可以看做是顶点之间制约关系的描述.把顶点看作是一个个任务,则对于有向边<Vi,Vj>表明任务Vj的完成需等到任务Vi完成之后,也就是说任务Vi先于任务Vj完成.对于一个有向图,找出一个顶点序列,且序列满足:若顶点Vi和Vj之间有一条边<Vi,Vj>,则在此序列中顶点Vi必在顶点Vj之前.这样的一个序列就称为有向图的拓扑序列(topological order). 步骤 从有向图中选取一个没有前驱(入度为0)的顶点输出. 删除图中所有以它为

数据结构:图的实现--邻接表

使用邻接表实现图结构 当图中的边数较少时,用邻接表来实现图结构,则会浪费很多内存空间.因此,考虑另一种实现图结构的方法:邻接表.在邻接表中主要有两种节点结构体: 顶点节点 边节点 直接看代码 类定义 #include<iostream> #include<iomanip> using namespace std; //最大权值 #define MAXWEIGHT 100 //边节点 typedef struct edgenode_tag { int adjvex; //邻接点 in

【算法与数据结构】图 -- 邻接表

/************************************************************************ 边(弧)结点 -------------------------- |adjvex | info | nextarc | -------------------------- adjvex:邻接点域,该点在图中的位置 info :相关信息,比如可以保存从某顶点到该点的权值 nextac:指向下一个与该点有相同邻接点的顶点 顶点结点 ---------

【算法与数据结构】图 -- 数组表示法

图的数组表示法 借助一个二维数组表示图,该二维数组的第i行,第j列的值表示从Node[i]到Node[j]: 无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称. 有向图(网):是否有弧 / 权值. //图的数组表示法 //最大顶点个数 const int MAX_VERTEX = 100; //最大值 const int MAX_VALUE = (1 << 31) - 1; typedef struct _tagArcCel

数据结构之图(术语、存储结构、遍历)

1.相关术语 顶点(Vertex).弧(Arc).弧头(初始点).弧尾(终结点).边(Edge).有向图(Directed graph).无向图(Undigraph).完全图(Completed grapg).有向完全图.稀疏图(Sparse graph).稠密图(Dense graph).权(weigh).网(network).无向网.有向网.子图(Subgraph).邻接点(Adjacent).度(Degree).入度(Indegree).出度(Outdegree).路径(path).简单路

【算法与数据结构】图 -- 十字链表

图的[十字链表]表示法是一种链式存储结构,可以看成是[邻接表]和[逆邻接表]的组合 本文中用到的有向图 /************************************************************************ 有向图的存储:十字链表 有向图的十字链表存储结构,是有一种链式存储结构,可以看成是[邻接表]和[逆邻接表] 的结合. 图中每条弧对应一个[弧结点],每个顶点对应一个[顶点结点] 弧结点 -------------------------------

数据结构之图 Part3 – 2 遍历

BFS using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LH.GraphConsole { class Program { private static bool[] visited; private static Queue<int> rootVertexQueue = new Queue<int>(); static void Main