是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
稠密图用邻接矩阵存储,稀疏图用邻接表存储存储结构较省空间。
若顶点vi到vj之间的边没有方向,则这条边为无向边,表示为(vi,vj)或(vj,vi),反之为有向边(或弧),表示为<vi,vj>,其中vi称为弧尾,vj称为弧头。若图中所有边都为无向边,则该图为无向图,反之若都为有向边,则为有向图。
简单图: 不存在顶点到其自身的边,且同一条边不重复出现。
无向完全图: 任意两个顶点中都存在边的无向图。若顶点为n个,则边数为n(n-1)/2。
有向完全图: 任意两个顶点中都存在边的有向图。若顶点为n个,则边数为n(n-1)。
稀疏图和稠密图: 有很少条边或弧的图称为稀疏图,反之称为稠密图。
权: 与边或弧相关的数;带有权的图称为网。
网: 边上带有权值的图称为带权图,也称网。
路径: 由顶点和相邻顶点序偶构成的边所形成的序列。
路径长度: 一条路径上经过边的数目。
简单路径: 若一条路径上除开始点和结束点可以相同以外,其余顶点均不相同。
图的存储结构: 邻接矩阵,邻接表
邻接矩阵: 采用邻接矩阵数组表示顶点之间相邻关系的存储结构。
特点:
(1)图的邻接矩阵表示是唯一的。
(2)对于含有n个顶点的图,当采用邻接矩阵存储时,无论有向图还是无向图,也无论边的数目是多少,其存储空间都为O(n^2),所以邻接矩阵适合于存储边的数目较多的稠密图。
(3)无向图的邻接矩阵数组一定是一个对称矩阵,因此可以采用压缩存储的思想,在存放邻接矩阵数组时只需存放上(或下)三角部分的元素即可。
(4)对于无向图,邻接矩阵数组的第i行或第i列非零元素、非∞元素的个数正好是顶点i的度。
(5)对于有向图,邻接矩阵数组的第i行(或第i列)非零元素、非∞元素的个数正好是顶点i的出度(或入度)。
(6)在邻接矩阵中,判断图中两个顶点之间是否有边或者求两个顶点之间边的权的执行时间为O(1)。所以在需要提取边权值的算法中通常采用邻接矩阵存储结构。
邻接表: 一种顺序与链式存储相结合的存储结构。
特点:
(1)邻接表的表示不唯一,这是因为在每个顶点对应的单链表中各边结点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。
(2)对于有n个顶点和e条边的无向图,其邻接表有n个头结点和2e个边结点;对于有n个顶点和n条边的有向图,其邻接表有n个头结点和e个边结点。显然,对于边数目较少的稀疏图,邻接表比邻接矩阵更节省存储空间。
(3) 对于无向图,邻接表中的顶点i对应的第i个单链表的边节点的数目正好是顶点i的度。
(4) 对于有向图,邻接表中顶点i对应的第i个单链表的边节点的数目仅仅是顶点i的出度。顶点i的入度为邻接表中所有adjvex域值为i的边结点数目。
(5)在邻接表中,查找顶点i关联的所有边是非常快速的,所以在需要提取某个顶点的所有邻接点的算法中通常采用邻接表存储结构。
最小生成树 :图的所有生成数中具有边上的权值之和最小的树称为图的最小生成树。
构造最小生成树一定有下面两个特点:
1.尽量选取最小的权值的边,并且不能有回路2.n个顶点只选取n-1条边。
普里姆算法是一种构造性算法,是归并顶点的算法,与边数无关,所以适用于稠密图求最小生成树,时间复杂复杂度为O(n^2})。
普里姆(Prim)算法需要频繁地取一条条边的权,所以图采用邻接矩阵合适。
Prim算法思想: 可取图中任意一个顶点V作为生成树的根,之后若要往生成树上添加顶点W,则在顶点V和W之间必定存在一条边。并且该边的权值在所有连通顶点V和W之间的边中取值最小。
Prim算法步骤 :1.从图中某一个顶点出发,寻找它相连的所有结点,比较这些结点的权值大小,然后连接权值最小的那个结点。2.然后将寻找这两个结点相连的所有结点,找到权值最小的连接。3.重复上一步,直到所有结点都连接上
克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。执行时间仅与图中的边数有关,与顶点数无关,所以适用于稀疏图求最小生成树,时间复杂复杂度为O(elog2^e})。
Kruskal算法的具体思想: 将所有边按照权值的大小进行升序排序,然后从小到大一一判断,条件为:如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,舍去。直到具有 n 个顶点的连通网筛选出来 n-1 条边为止。筛选出来的边和所有的顶点构成此连通网的最小生成树。
Kruskal算法思路: 1. 将图中的所有边都去掉。2.将边按权值从小到大的顺序添加到图中,保证添加的过程中不会形成环。3.重复上一步直到连接所有顶点,此时就生成了最小生成树。这是一种贪心策略。
判断是否会产生回路的方法为: 在初始状态下给每个顶点赋予不同的标记,对于遍历过程的每条边,其都有两个顶点,判断这两个顶点的标记是否一致,如果一致,说明它们本身就处在一棵树中,如果继续连接就会产生回路;如果不一致,说明它们之间还没有任何关系,可以连接。
对比普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
1.Kruskal算法主要针对边来展开,边数较少时效率非常高,所以对于稀疏图有很大的优势。2.Prim算法对于稠密图,边数非常多的情况更好一些。3.Kruskal算法在效率上要比Prim算法快,因为Kruskal只需要对权重边做一次排序,而Prim算法则需要做多次排序。
在一个有向图中找一个拓扑序列的过程称为拓扑排序。
有回路的图不能进行拓扑排序,任何有向网拓扑排序的结果不是唯一的。
拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它。
(2)从图中删去该顶点,并且删去从该顶点发出的全部有向边。
(3)重复上述两步,直到剩余的图中不再存在没有前驱的顶点为止。
无向图: 一个顶点所关联的边的目称为该顶点的度,无向图有n(n-1)/2条边。
有向图: 一个顶点的入度与出度的和为该顶点的度, 有向图有n(n-1)条边。
对于n个顶点的无向图G,若G是连通图,至少有n-1条边。若G是非连通图,则最多有C_{n-1}^2条边。
对于n个顶点的有向图G,若G是强连通图,至少有n条边(形成回路)。
N个顶点的树,则必有n-1条边
一个图中所有顶点的度之和等于边数的两倍。
若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值