从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为 图的遍历。
图的遍历得到的顶点序列称为图遍历序列。
图的遍历算法有深度优先搜索算法和广度优先搜索算法。
深度优先搜索(Depth First Search–DFS)遍历类似树的先序遍历,是树的先序遍历的推广。
深度优先搜索算法思想:
设初始状态时图中的所有顶点未被访问,则:
⑴ :从图中某个顶点vi出发,访问vi;然后找到vi的一个邻接顶点vi1 ;
⑵:从vi1出发,深度优先搜索访问和vi1相邻接且未被访问的所有顶点;
⑶:转⑴ ,直到和vi相邻接的所有顶点都被访问为止
⑷ :继续选取图中未被访问顶点vj作为起始顶点,转(1),直到图中所有顶点都被访问为止。
广度优先搜索算法思想:
算法思想:
设初始状态时图中的所有顶点未被访问,则:
⑴ :从图中某个顶点vi出发,访问vi;
⑵:访问vi的所有相邻接且未被访问的所有顶点vi1,vi2,…,vim;
⑶:以vi1,vi2, …,vim的次序,以vij(1≦j≦m)依此作为vi ,转⑴;
⑷ :继续选取图中未被访问顶点vk作为起始顶点,转⑴,直到图中所有顶点都被访问为止。
生成树一定是连通的,一定是连通的生成子图这句话是对的
但是,连通的生成子图一定是生成树就是错的
一个图可以有多个生成树,有n个顶点的生成树的最少的边是n-1个
最小生成树:
生成树、生成森林:一个连通图(无向图)的生成树是一个极小连通子图,它含有图中全部n个顶点和只有足以构成一棵树的n-1条边,称为 图的生成树。
关于无向图的生成树的几个结论:
◆ 一棵有n个顶点的生成树有且仅有n-1条边;
◆ 如果一个图有n个顶点和小于n-1条边,则是非连通图;
◆如果多于n-1条边,则一定有环;
◆有n-1条边的图不一定是生成树。
一个连通图的生成树是一个极小连通子图,它含有图中全部n个顶点和构成一棵树的(n-1)条边。
命题:如果在一棵生成树上添加一条边,必定构成一个环。
由深度优先遍历得到的生成树称为深度优先生成树。
由广度优先遍历得到的生成树称为广度优先生成树。
连通图:
仅需调用遍历过程(DFS或BFS)一次,从图中任一顶点出发,便可以遍历图中的各个顶点,产生相应的生成树。
非连通图:
需多次调用遍历过程。每个连通分量中的顶点集和遍历时走过的边一起构成一棵生成树。所有连通分量的生成树组成非连通图的生成森林。
带权连通图:
对于带权连通图G (每条边上的权均为大于零的实数),可能有多棵不同生成树。
每棵生成树的所有边的权值之和可能不同。
其中权值之和最小的生成树称为图的最小生成树。
最小生成树有两种算法,即 普里姆算法(Prim) 和 克鲁斯卡尔算法(Kruskal)
普里姆算法(Prim):先选一个顶点作为起点,然后再根据权值进行连接(小的优先),将连接好的作为一个整体,重复按照权值信息进行连接(不能出现环)。
对于普里姆算法,给出例题:
从A开始
克鲁斯卡尔算法(Kruskal):找两个权值最小的边画出,保证每个顶点只能构成一条边。
注意:遍历时不看权值,最小生成树或最短路径或关键路径时才看权值