第四次具体总结

图的遍历:

遍历定义:

从已给的连通图某一顶点出发,沿着一些边访遍图中所有的顶点,且每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。

遍历的实质:找每个点的邻接点的过程。

图中可能有回路,如何避免重复访问:

解决思路:设置辅助数组visited[n],用来标记每个被访问过的顶点,visited[ i ]初始状态为0,顶点 i 被访问visited[ i ]为1,防止被多次访问。

深度优先遍历(DFS):

方法:1. 在访问图中某一起始顶点 v 后,有 v 出发访问它的任一邻接顶点w1;

           2. 再从w1出发,访问与w1邻接但还未被访问过的顶点w2;

           3. 再从w2出发进行类似的访问;

           4. 如此进行下去,直到到达所有的邻接点都被访问过的顶点 u 为止;

           5. 接着退回一步,推到前一次刚访问过的顶点,看是否还有其他未被访问过的邻接顶点;

           6. 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;

           7.如果没有,就再退回一步进行搜索,重复上述过程直至连通图中所有顶点都被访问过

              为止。

        连通图的深度优先遍历类似于树的先跟遍历;

        稠密图适于在邻接矩阵上进行深度遍历;

        稀疏图适于在邻接表上进行深度遍历 。

广度优先搜索(BFS —breadth_first_search):

方法:从图的某一节点开始,首先访问该节点的所有邻接结点,在按照这些顶点被访问的次序依次访问与它们相邻接的所有未被访问的顶点,重复此过程,直至所有顶点均被访问为止。可以利用队列。

        类似于树中的层次遍历。

时间复杂度只与存储结构有关(邻接矩阵或者邻接表),而与搜索路径无关。

生成树的另一种表示方法:

设图G(V,E)是个连通图,当从图任一顶点出发遍历图G时,将边集E(G)分成两个集合T(G)和B(G)。其中T(G)是遍历图时所经过的边的集合,B(G)是遍历图时未经过的边的集合。显然,G1(V,T)是图G的极小连通子图。即子图G1是连通图G的生成树。

最小生成树:给定一个无向网络,在该网的所有生成树中,使各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。

MST性质(Mininum Spanning Tree):

设N = (V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u,v)是一条具有最小权值的边,其中u属于U,v属于V,则必存在一棵树包含边(u,v)的最小生成树。

解释:在生成树的构造过程中,图中 n 个顶点分属两个集合:

        已落在生成树上的顶点集:U;

        尚未落在生成树上的顶点集:V-E;

接下来则应在所有连通 U中顶点和V-U中顶点的边来选取权值最小的边。

(prim)普里姆算法:

算法思想:设N = (V,E)是个连通网,TE是最小生成树中边的集合,初始令U = { u0 },(u0属于V),TE= { 空 }。

在所有u属于U,v属于V-U的边(u,v)属于E中,找一条代价最小的边(u0 , v0),

将(u0 , v0)并入集合TE,同时v0并入U;

重复上述操作直至U = V为止,则T = (V , TE)为N的最小生成树。

                选择点,适用于稠密图。

(Kruskal)克鲁斯卡尔算法:

算法思想:设N = (V,E)是一个连通网,令最小生成树初始状态为只有n个顶点而无边的非连通图T = (V , { }),每个顶点自成一个连通分量。

在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即不能形成环),则将此边加入到T中,否则舍去此边,选取下一条代价最小的边。

依次类推,直至T中所有顶点都在同一连通分量上为此。

最短路径:

在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。

单源最短路径:用Dijkstra(迪杰斯特拉)算法;

所有顶点间的最短路径:用Floyd (弗洛伊德)算法。

Dijkstra(迪杰斯特拉)算法:

        1.初始化:先找出从源点v0到各终点vk的直达路径(v0 , vk),即通过一条弧到达的路径;

        2.选择:从这些路径中找出一条长度最短的路径(v0 , u);

        3.更新:然后对其余各条路径进行适当调整:若在图中存在弧(u,vk),且(v0,u)+(u,vk)< (v0, vk),则以路径(u0,u,vk)替代(v0,u)。

在调整后的各条路径中,再找长度最短的路径,以此类推。

弗洛伊德(Floyd)算法:

算法思想:逐个顶点试探,从 vi 到 vj 的所有可能存在的路径中,选出一条长度最短的路径。

求最短路径步骤:初始时设置一个n阶方阵,令其对角线元素为0,若存在< vi , vj >则对应元素为权值,否则为∞。逐步试着在原路径中增加中间顶点,若加入中间顶点后路径变短,则修改之,否则维持原值。所有顶点试探完毕,算法结束。

有向无环图:

无环的有向图,简称DAG图(Directed Acycline Graph)

        通常用来描述一个工程或系统的进行过程。

AOV网:

 用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的图,简称AOV网(Activity On Vertex Network)。

AOE网:

用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网(Activity On Edge)。

AOV网的特点:若< vi , vj >是网中有向边,则 i 是 j 的直接前驱,j 是 i 的直接后继;

AOV网中不允许有回路,因为如果有回路存在,则表明某项活动以自己为先决条件,显然是错误的。

拓扑排序:

在AOV网中没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV有                  弧< vi , vj >存在,则在这个序列中,i 一定排在 j 的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序。

拓扑排序的方法:

在有向图中选一个没有前驱的顶点且输出;

删除此顶点和所有依此顶点为尾的弧;

重复上述步骤,直至所有顶点均已输出或当图中无没有前驱顶点存在时。

检测AOV网中是否存在环的方法:

对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网中比不存在环。

        一个AOV网的拓扑序列不唯一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucky登

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值