数据结构之—图

来源:互联网 发布:淘宝中差评多久消失 编辑:程序博客网 时间:2024/06/10 04:59
1.图的两种遍历方法:
1) 深度优先搜索遍历

深度优先搜索DFS遍历类似于树的前序遍历。其基本思路是:

a) 假设初始状态是图中所有顶点都未曾访问过,则可从图G中任意一顶点v为初始出发点,首先访问出发点v,并将其标记为已访问过。

b) 然后依次从v出发搜索v的每个邻接点w,若w未曾访问过,则以w作为新的出发点出发,继续进行深度优先遍历,直到图中所有和v有路径相通的顶点都被访问到。

c) 若此时图中仍有顶点未被访问,则另选一个未曾访问的顶点作为起点,重复上述步骤,直到图中所有顶点都被访问到为止。

                                                              

2) 广度优先搜索遍历

广度优先搜索遍历BFS类似于树的按层次遍历。其基本思路是:

a) 首先访问出发点Vi

b) 接着依次访问Vi的所有未被访问过的邻接点Vi1,Vi2,Vi3,…,Vit并均标记为已访问过。

c) 然后再按照Vi1,Vi2,… ,Vit的次序,访问每一个顶点的所有未曾访问过的顶点并均标记为已访问过,依此类推,直到图中所有和初始出发点Vi有路径相通的顶点都被访问过为止。



如果采用邻接矩阵存储,则时间复杂度为O(n2),若采用邻接表,则时间复杂度为O(n+e)。
生成树:是将图中所有顶点以最少的边连通的子图。
最小生成树:是权值和最小的生成树就是最小生成树。
最短路径可以使用迪杰斯特拉(Dijkstra)算法。

AOV网是一个有向无环图。即不应该带有回路,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。AOV网的拓扑序列不是唯一的,满足上述定义的任一线性序列都称作它的拓扑序列。

检测有向环的一种是对AOV网络构造它的拓扑有序列。即将各个顶点(代表各个活动)排成一个线性有序序列,使得AOV网络中所有应存在的前驱和后继关系都能满足。另一种是深度优先搜索(没有出现祖先的回路)。

拓扑排序方法:
<1>从有向图中选取一个没有前驱的顶点,并输出之;
<2>从有向图中删去此顶点以及所有以它为尾的弧;
<3>重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
                                                                
                                                     

无向完全图:
任意一个具有n个结点的无向简单图,其边数小于等于n*(n-1)/2;我们把边数恰好等于n*(n-1)/2的n个结点的无向图称为完全图。

有向完全图:
在一个n个结点的有向图中,最大边数为n*(n-1)。

强连通图:

有向图强连通分量的Tarjan算法 [有向图强连通分量]。

在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。

直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。 [Tarjan算法]

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

0 0
原创粉丝点击