数据结构(四) 图(Graph)

   在图形结构中,结点之间的关系可以是任意的。

一、图

  图由定点(vertex)和边(edge)两个有限集合组成:

Graph=(V,R)

  V是定点集,R={E},E是边集。

  有向图(directed network):从一个顶点指向另一个顶点。用有序对<u,v>表示

  无向图:用无序对(u,v)代替有序对。

  有向网:有向图的边上有正的权值。

  无向网:无向图的边上有正的权值。

 

  n为图中顶点数,e为图中边数,不考虑顶点到自身的边:

  (1)对无向图而言, e在[0,n(n+1)/2]范围内。满边称为完全图;

  (2)对有向图,e在[0,n(n-1)],满边称为有向完全图。

  有较少条边的图称为稀疏图,有较多条边的图称为稠密图。

 

  图中顶点的度degree:

  无向图中即为与顶点相关联的边的数目;

  有向图中:顶点有入度和出度,顶点的度数为两者之和。

 

  图中路径的定义:顶点序列中,任意序列相邻顶点的构成的边都存在,则称顶点序列构成一条长度为n-1的路径,路径长度是指包含的边的条数。

  如果路径上各个顶点都不同,则为简单路径。

  路径中如果首尾的顶点是同一个,则构成回路。

  一条回路中,除了起点与终点相同外,其它顶点都不相同,则为简单回路,或简单环

 

  一个无向图中任意两个不同的顶点都存在从一个顶点到另一个顶点的路径,则称此无向图是联通的(connected),无向图的极大联通子图称为联通分量

  对于有向图,如果一个有向图中任意两个不同的顶点u和v,都存在从顶点u到顶点v的路径,则称此有向图是强连通的,有向图的极大联通子图称为强连通分量。

 

  连通图的极小连通子图称为连通图的生成树,生成树包含图中全部n个顶点,只有n-1条边,并且任加新一条边,必将构成回路。

 

 

二、图的存储

  最常用的两种:邻接矩阵和邻接表。

 

三、图的遍历

         图的遍历算法一般是从一个起始顶点出发,试图访问全部顶点,则必须解决:

  (1) 从起点出发可能到达不了所有其它顶点(如非连接图);

  (2) 有些图存在回路,必须确定算法不会因回路而陷入死循环。

  解决办法是,为图的每个顶点保留一个标志(tag),在算法开始时,所有顶点的标志设置为false,遍历过程中,如某个顶点被访问,则置为true。后面再遇到tag为true 的点,就不访问,避免陷入死循环。

  若图是不联通的,则还有未被访问的顶点,这些顶点的标志值为false,这时可以从某个未被访问到的顶点开始继续搜索。

 

         深度优先搜索DFS:

         搜索过程中,每当访问某个顶点V后,DFS将递归地访问它的所有未被访问到的邻接的顶点,实际结果是沿着图的某一分支进行搜索,直到末端,再进行回溯,沿另一分支进行搜索。结果将产生一棵深度优先搜索树。

         时间复杂度与图的存储结构有关,主要花费在对每个顶点寻找邻接点的过程上。

 

         广度优先搜索BFS:

         以顶点V为起点,由近至远依次访问和V有路径相通且长度为1,2,…的顶点,知道所有被访问的顶点的邻接点都被访问完。若这时图中还有未被访问的顶点,选择一个未被访问的顶点作为起始点继续进行搜索,直到图中所有顶点都被访问完为止。

         时间复杂度是一样的。

 

                             

四、连通无向网的最小代价生成树

  最小代价生成树MST,对于一个给定连通网Net,最小代价生成树包括Net中所有顶点和部分边,且满足下列条件:

  (1)    MST边的条数是顶点个数减1,并且保证MST是连通的;

  (2)    MST边上的权值之和最小。

 

  构造最小代价生成树的两种算法:

  Prim算法——直到有n-1条边(从顶点出发);

  Kruskal算法——直到所有的顶点在同一颗树上(从边入手);

 

五、有向无环图(Direxted Acyclic Graph)

         判断有向无环图:拓扑排序or深度优先搜索,DFS(v)结束之前出现一条从顶点u到v的回边,则必定存在包含顶点u和v的回路。

  1、  拓扑排序

  2、  关键路径

 

六、最短路径

  1、 单源点最短路径问题

  2、 所有顶点之间的最短路径问题

 

posted @ 2018-03-21 14:35  爆炸的果核  阅读(1060)  评论(0编辑  收藏  举报