【笔记】大话数据结构-图

图的顶点与边之间的关系

无向图,顶点v的度是和v相关联的边的数目,记为TD(v)。
有向图,顶点v为头的弧的数目称为v的入度,记为ID(v);顶点v为尾的弧的数目称为v的出度,记为OD(v)。TD=ID+OD。

第一个顶点和最后一个顶点相同的路径称为回路或环。

顶点序列中顶点不重复出现的路径称为简单路径。除了第一个和最后一个顶点之外,其他顶点不重复出现的路回路,称为简单回路/简单环。

连通图

无向图中,任意两个顶点都连通的图,称为连通图。

无向图中的极大连通子图称为连通分量。

有向图中,任意两个顶点都有路径(双向)的图,称为强连通图。

有向图中的极大强连通子图称为强连通分量。

连通图的生成树是一个极小的连通子图,它含有图中所有n个顶点,但只有足够构成一棵树的n-1条边。

如果一个有向图恰有一个顶点入度为0,其他顶点入度全为1,称为有向树。

邻接矩阵

普通图:有路径为1,反之为0。
网(有权重的图):有路径为相应权值W,对角线0,其余为∞。

邻接表

顶点表:data(存顶点)和firstedge(指向边表第一个结点)。
边表结点:adjvex(邻接点下标)和next(指向边表下一个结点)。
若带权值(即是网),在边表结点中增加weight(存权值)。
【适合无向图】

十字链表

顶点表:data(存顶点)和firstin(入边表头指针)和firstout(出边表头指针)。
边表结点:tailvex(弧起点下标)和headvex(弧终点下标)和headlink(指向同终点的下一条边)和taillink(指向同起点的下一条边)。
若带权值(即是网),在边表结点中增加weight(存权值)。
【适合有向图】

邻接多重表

边表结点:ivex(某边两个顶点之一的下标)和ilink(指向依附ivex的下一条边)和jvex(某边两个顶点之一的下标)和jlink(指向依附jvex的下一条边)。

边集数组

两个一维数组,一个存储顶点信息,另一个存储边的信息。边数组每个数据元素由起点下标、终点下标、权构成。

深度优先遍历DFS

把根节点压入栈中。每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。

广度优先遍历BFS

把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。

最小生成树

构造连通网的最小代价生成树称为最小生成树。经典算法:普里姆算法,克鲁斯卡尔算法。

Prim算法

从点U0开始,选代价最小的边,到第二个点同理,直到所有点被包含。

Kruskal算法

把边按权值排序,从小到大选边,若点间已有路径则不选,直到所有点被包含。

Dijkstra算法

  1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值。
    若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值。若不存在<V0,Vi>,d(V0,Vi)为∞。
  2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中。
  3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值。
    重复上述步骤2、3,直到S 中包含所有顶点,即W=Vi为止。

Floyd算法

  1. 从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
  2. 对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

拓扑排序

AOV网:一个表示工程的有向图中,顶点表示活动,弧表示活动间优先关系。(不存在回路)
拓扑序列:从顶点vi到vj有一条路径,且vi在vj之前,满足这样的顶点序列成为拓扑序列。
拓扑排序:对一个有向图构造拓扑序列的过程。构造时会有两个结果:全部顶点被输出,是AOV网;有没被输出顶点,证明有回路,不是AOV网。

算法:使用邻接表,增加入度域in。从AOV网中选取入度为0的顶点入栈,输出,并删除此顶点的弧(指向的顶点入度-1),重复此步骤直到输出全部顶点或没有入度为0的顶点。

关键路径

AOE网:一个表示工程的有向图中,顶点表示事件,有向边表示活动,边权值表示活动时间。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Ethan_997/article/details/108545691