复习一下数据结构——图

图是一种网状结构,图分为有向图和无向图。

图的存储方式:

1、邻接矩阵存储又称为二维数组存储。

2、邻接表存储法

3、十字链表存储法

图的遍历:

1.求图的连通性问题

2.图的拓扑排序(有向带权图)

将入度为0的顶点vi加入V,删除该顶点及该顶点对应的弧度,再次查找入度为0的顶点重复上面操作,直到不存在入度为0的顶点。若此时输出的顶点数小于图中的顶点数则说明存在环。(若存在顶点无法加入V,说明该图存在回路)

3.图的关键路径

图的顶点表示事件,边表示活动。

求关键路径步骤:1、先进行拓扑排序并找出活动最早开始时间,然后逆拓扑排序找出活动最晚开始时间,最早开始时间==最晚开始时间的活动即为关键路径的活动。

4.图搜索:图的深度搜索和图的广度搜索。

最小生成树算法:

1.prime算法---从任意一顶点出发,找权重最小的边

在带权连通图中V是包含所有顶点的集合, U已经在最小生成树中的节点,从图中任意某一顶点v开始,此时集合U={v},重复执行下述操作:在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边,将(u,w)这条边加入到已找到边的集合,并且将点w加入到集合U中,当U=V时,就找到了这颗最小生成树。

2.Kruskal算法---从权重最小的边出发

假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择权值最小的边,若该边依附的顶点落在T中不同的连通分量中,则将此边加入到T中;否则,舍去此边而选下一条权值最小的边;依次类推,直到T中所有顶点都在同一个连通分量上(此时含有n-1边)为止,这时的T就是一棵最小的生成树。

图的最短路径:

1.Dijkstra算法

初使时令 S={V0},T={其余顶点},T中顶点对应的距离值, 若存在<V0,Vi>,为<V0,Vi>弧上的权值(和SPFA初始化方式不同),若不存在<V0,Vi>,为Inf。
从T中选取一个其距离值为最小的顶点W(贪心体现在此处),加入S(注意不是直接从S集合中选取,理解这个对于理解vis数组的作用至关重要),对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值(上面两个并列for循环,使用最小点更新)。

重复上述步骤,直到S中包含所有顶点,即S=V为止(说明最外层是除起点外的遍历)。

例如:



Floyd算法
基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点到B,所以,我们假设dist(AB)为节点A到节点B的最短路径的距离,对于每一个节点K,我们检查dist(AK) + dist(KB) < dist(AB)是否成立,如果成立,证明从A到K再到B的路径比A直接到B的路径短,我们便设置 dist(AB) = dist(AK) + dist(KB),这样一来,当我们遍历完所有节点K,dist(AB)中记录的便是A到B的最短路径的距离。


猜你喜欢

转载自blog.csdn.net/weixin_38679007/article/details/80591781
今日推荐