拓扑排序
G是有n个顶点的有向图,G的拓扑排序是对G的每条边来说G的顶点的顺序,这种情况下i<j。也就是说,拓扑排序是一种排序,使得G的有向路径以增加的顺序遍历顶点。需要注意的是一个有向图可能不止有一个拓扑排序。
在有向图中以顶点表示活动,有向边表示活动之间的先后关系,这样的图称为AOV网。拓扑排序就是将各活动排一个先后次序
命题:G有一个拓扑排序当且仅当它是非循环的
做法:1.从有向图中选一个没有前驱的顶点,并且输出 2.删除该顶点以及以它为起点的边。重复这两个步骤。直到找不到没有前驱的点
应用: - 判断是否有环(无环图的所有点都能进行拓扑排序) - 课程安排问题
代码: ?
最短路径
定义G为加权图,路径的长度(或权重)是P的边的权重的总和。图中顶点u到顶点v之间的距离表示为,是从u到v之间长度最短的路径,如果这样的路径存在的话
Dijkstra算法
我们对V中的每个顶点定义一个标签,存储目前为止从到找到的最好的路径的长度。首先,对每个并且,然后定义集合,初始状态下是空集合。在算法的每次迭代总,选择不在中有最短的标签的顶点,然后把放进。一旦新顶点被放进中,接下来更新每个邻近并且在之外的顶点v的标签
最小生成树
问题定义:对于一个无向有权的图G,我们希望找到一棵树,它包含G中的所有顶点,并最小化权重总和
这样的包括连通图G的每个顶点的树被称为生成树,计算一棵有最小权重总和的生成树T的问题称为最小生成树(MST)问题
命题:是一个有权重的连通的图,令和是两个不相交的非空集合的的顶点的一部分。令是那些一个端点在另一个端点在的有最小权重的的边。这就是一棵最小生成树,是它的一条边。
如果G的权重是不同的,那么最小生成树是唯一的
Prim-Jarnik算法
贪心准则——加入后仍形成树,且耗费最小
算法过程:1.从单一顶点的树T开始 2.不断加入耗费最小的边(u,v),使T∪(u,v)仍为树
Kruskal算法
找最短的边,连接了AB,判断AB是否被已选的边连在一起,如果是就不选这条边
实现的方法——并查集