算法笔记6-有向图
有向图
它的边都是单向的。每条边连接的顶点都是有序对。
顶点的出度:以顶点v为弧尾的弧的数目。
顶点的入度:以顶点v为弧头的弧的数目。
顶点的度= 出度+入度
路径:非带权路径长度,指此路径上边的条数。带权路径是指,各边的权之和
简单路径:路径上各个顶点均不互相重复。
简单回路:若路径上第一个顶点和最后一个顶点重复,则称这样的路径为回路或者环
连通图和连通分量:是无向图的概念,若从顶点v1到v2有路径,则称v1与v2是连通的。。 如果图中任意一对顶点都是连通的,则称此图为连通图。。。 非连通图的极大连通子图,叫做连通分量
强连通图和强连通分量:是有向图的概念,若对于每一个对顶点Vn和Vm,都存在一条从Vn到Vm,和Vm到Vn的路径,则称此图是强连通图。
非强连通图的极大强连通子图,叫做强连通分量。
生成树:一个连通图有n个顶点和e条边,其中n-1条边和n个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。
有向图的邻接表和逆邻接表:
带权的图
网络的邻接矩阵,在V*V的矩阵中,如果V1顶点指向V2顶点,那么[1,2]存放权值,如果V2没有指向V1,[2,1]写入无穷。
网络的邻接表,增加一个存储,存放权值
有向无环图:
是有向图的一种,就是图中没有环。常被用来表示事件之间的驱动依赖关系,管理任务之间的调度。
在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图
拓扑排序是对有向无环图的顶点进行排序。有有向无环图才有拓扑排序
通常一个有向无环图可以有一个或者多个拓扑排序序列
实现由两种算法:入度表、DFS
入度表,1.找出图中入度为0的顶点。 2.依次在图中删除这些顶点,删除后再找度为0的顶点 3.知道删除所有顶点,完成拓扑排序
DFS,顶点必须比其邻接点先出现。
我们打印一个顶点,然后递归深度优先搜索,其相邻的顶点。一直递归下去,知道DFS结束,那就意味着,这个节点是最后一个节点。没有下一个节点所指。将最后的节点,放入栈中,一次递归结束,运行上一层递归,将上一个顶点,放入栈中(此操作在递归方法最后)。。最后再打印内容。
最小生成树:
使用不同的遍历方法,可以得到不同的生成树。从不同的顶点出发也可以得到不同的生成树。
准则:
1.必须使用且仅使用该网络中的n-1条边,来连接网络中的n个顶点
2.不能使用产生回路的边
3.各边上的权值的总和达到最小
Prim算法:
在加权连通图里搜索最小生成树,的算法。
基本思想,从连通网络中,某一个顶点u出发,选择与它关联的具有最小权值(关联多条边,边上的数字最小的那一条)的边。将其顶点加入到生成树顶点集合U中(路径)。直到所有顶点都被该路径,经过。
代码表示:我们声明一个lowcost数组,表示当前选中顶点,与所有边的权值。(如果没有两个顶点没有直接相连,则*,无通路)
声明mst数组,表示选中的顶点能够与谁相连。
比如上图,选中0,则lowcost[0]=0,lowcost[1]=28,lowcost[2]=*,lowcost[5]=10...等等
此处因为是起点所以所有默认为0,也就是mst[2]=0,mst[3]=0....
可以看出最小权值是10,那么边
<mst[5],5> = 1 加入到mst数组 可能看不太懂,那么就是mst数组的<0,5> 设置为1 。 mst[5], 就是0咯。
Kruskal算法:
基于贪心算法思想得到的。首先我们把所有边按权值大小排列。接着按照顺序选取每条边。如果选择的边,的两个端点不属于同一个集合。那么将两个端点并入集合。
也就是每次都选最小的边,然后选择端点。
根据图我们可以知道:AD=5 , CE =5,DF = 6 ....
将所有边排序。
我们发现ad,ce都不在一棵树上,所以都被选中。接下来是df , ab , be ,eg