【数据结构与算法】图


    一、概念

    定义: 图由集合和集合组成,记做G=(V,E),其中点集合不能为空且应该有穷,边集合可以为空。

    ①有向图:边有方向,用<Vi,Vj>表示

    ②无向图:边没有方向,用(Vi,Vj)表示

    ③完全图:每两个顶点之间都有连线,有向完全图的边有n(n+1)个;无向完全图有n(n+1)/2个边。

    ④路径和回路:路径是指从一个点到另外一个点走过的路径和长度;回路是指从一个点出发再回到一个点的路径;简单回路是指中间没有重复经过的点。

    顶点的度、入度、出度:顶点的度(degree)是和边(V1)相关联的边的数目,有向图中,以V1为头的弧的数目称为V1的入度,以V1为尾的弧的数目称为V1的出度。其中v1——>v2中,v1是弧尾,v2是弧头。无向图没有入度、出度的概念,和边相连的边的数目就是度。

    连通图、连通分量、强连通图、强连通分量:无向图G中,如果从顶点V到顶点V’有路径,则称V和V’是连通的。如果对于图G中任意两个顶点Vi,Vj ∈V都是连通的,则称为G是连通图(connected graph).连通分量指的是无向图中极大连通子图。在有向图G中,如果对于每一对Vi,Vj∈V,Vi<>Vj,从Vi到Vj和从Vj到Vi都存在路径,则称G是强连通图。有向图中极大强连通子图称作为有向图G的强连通分量。

    子图:假设有两个图G={V,{E}}和G’={V’,{E’}},如果V’包含于V,E’包含于E,则称G’是G的子图。

    权和网:在图的边或弧上,有时标有与它们相关的数,这种与图的边或弧相关的数称作权(Weight)。这些权可以表示从一个顶点到另一个顶点的距离或代价。这种带权的图常称作网(network)。

    ⑨生成树:一个连通图的生成树,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。

    二、存储结构

    ①邻接矩阵:反映的是顶点间的相邻关系。一个n行n列的矩阵表示由n个顶点的图,如果(i,j)或者<i,j>属于边集合,则矩阵中第i行j列的值为1,否则为0。其中,无向图的邻接矩阵是对称矩阵

例如:


    ②邻接表:为图的每个顶点建立一个链表,第i个链表中的结点表示与顶点i相关的边。

例如:


    ③十字链表:(orthogonallist)是有向图的一种链式存储结构,可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中对应于有向图中的每一条弧和每个顶点的结构如下:


例如:


    ④邻接多重表:针对无向图; 如果我们只是单纯对节点进行操作,则邻接表是一个很好的选择,但是如果我们要在邻接表中删除一条边,则需要删除四个顶点(因为无向图);在邻接多重表中,只需要删除一个节点,即可完成边的删除,因此比较方便;因此邻接多重表适用于对边进行删除的操作;顶点节点和邻接表没区别:

    其结点结构如下:mark | ivex |ilink | jvex | jlink  
    其中,mark为标志域,用以标记该条边是否已被访问;ivex和jvex为该边依附的两个顶点;ilink和jlink分别为指向依附于ivex和jvex下一条边的指针。
    每个顶点也可以用一个结点表示:data |firstedage
    data域存储和顶点有关的信息,firstedage指示第一条依附于该定点的边。
    在邻接多重表中,所有依附于同一顶点边都串联在同一链表中,由于每条边依附于两个顶点,所以每个边结点同时链接在两个链表中。


    ⑤边集数组:带权图的另一种存储结构是边集数组,用边集数组表示带权图时列出每条边的起、始顶点及依附于这两个顶点的边上的权,边集数组一般可用一个二维数组分别存储依附于每条边的两端点,边上的权值用一个一维数组存储。在边集数组表示中,数组中对应的列下标表示同一弧的顶点及权值。它适用于一些以边为主的操作。这一存储结构同样适用于无向图


    三、图的遍历

    常见的图遍历方式有两种:深度优先遍历和广度优先遍历,这两种遍历方式对有向图和无向图均适用。

    ① 深度优先遍历(DFS)深度优先遍历的思想类似于树的先序遍历。其遍历过程可以描述为:从图中某个顶点v出发,访问该顶点,然后依次从v的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,直至图中所有与v有路径相通的顶点都被访问完为止。

    思想:往深里遍历,如果不能深入,则回朔;

深度优先:
    1.首先访问出发顶点V
    2.依次从V出发搜索V的每个邻接点W;
    3.若W未访问过,则从该点出发继续深度优先遍历;它类似于树的前序遍历。

    ① 广度优先遍历(BFS):对图的广度优先遍历方法描述为:从图中某个顶点v出发,在访问该顶点v之后,依次访问v的所有未被访问过的邻接点,然后再访问每个邻接点的邻接点,且访问顺序应保持先被访问的顶点其邻接点也优先被访问,直到图中的所有顶点都被访问为止。下面是对一个无向图进行广度优先遍历的过程。

    思想:对所有邻接节点遍历;

广度优先:
    1.首先访问出发顶点V
    2.然后访问与顶点V邻接的全部未访问顶点w、X、Y…
    3.然后再依次访问W、X、Y…邻接的未访问的顶点;

    四、最小生成树

     ①图的生成树和森林:对于一个拥有n个顶点的无向连通图,它的边数一定多余n-1条。若从中选择n-1条边,使得无向图仍然连通,则由n个顶点及这 n-1条边(弧)组成的图被称为原无向图的生成树。(图的生成树不是唯一的,从不同的顶点出发可以生成不同的生成树,但n个结点的生成树一定有n-1条边),如图,显示了一个无向连通图的生成树,双线圈表示的顶点为生成树的根结点。


     ①最小生成树:在一个图中,每条边或弧可以拥有一个与之相关的数值,我们将它称为权。这些权可以具有一定的含义,比如,表示一个顶点到达另一个顶点的距离、所花费的时间、线路的造价等等。这种带权的图通常被称作网。


    第一棵生成树的权值总和是:16+11+5+6+18=56;第二棵生成树的权值是:16+19+33+18+6=92。通常我们将权值总和最小的生成树称为最小生成树。

    最小生成树
    包含图所有顶点的树,成为图的生成树,各边权值之和最小的树成为最小生成树。
    普里姆算法:
    1. 定义出发点为一个集合
    2. 其它点为另外一个集合
    3. 找到顶点和其它点的距离,不可到达为无穷大
    4. 每确定一个点,则把这个点当做出发点集合中的点,从此点开始再次循环规则
    克鲁斯卡尔算法:
    1. 先确定各个点之间的距离
    2. 画出各个点
    3. 距离从小到大排序,依次加入画的顶点中(但是避免形成回路,如果形成回路,则忽略此距离),直到各个点之间可以连通。

    五、拓扑排序

    用有向边表示各顶点活动开始的先后顺序,这些顶点组成的网络成为AOV网络。对一个有向无环图的顶点排成一个线性序列,使得有向边起点排在该有向边终点前的序列称之为拓扑序列。拓扑排序不一定唯一。
    1. 找到入度为0的点,作为起点
    2. 起点完成后,删除该起点的出度
    3. 在剩余的aov网络中重复此过程


拓扑排序为:02143567或01243657或02143657或01243567

    六、关键路径

    AOV(拓扑排序)网络中,如果边上的权表示完成该活动所需的时间,则称这样的AOV为AOE网络。其中关键路径是最长的一条路径。如下:


    上图中的关键路径为V1--V2--Vk或V1--V4--Vk。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值