最短路径:
从一个顶点到其余各顶点的最短路径:
问题描述: 给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径,并限定各边上的权值大于或等于0。
单源最短路径问题: Dijkstra算法
狄克斯特拉(Dijkstra)求解思路:
设G=(V,E)是一个带权有向图, 把图中顶点集合V分成两组:
第1组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径v,… ,u,
就将u加入到集合S中,直到全部顶点都加入到S中,算法就结束了)。
第2组为其余未求出最短路径的顶点集合(用U表示)。
狄克斯特拉算法的过程:
(1)初始化: S只包含源点即S={v},v的最短路径为0。U包含除v外的其他顶点,U中顶点i距离为边上的权值(若v与i有边<v,i>)或∞(若i不是v的出边邻接点)。
(2) 从U中选取一个距离v最小的顶点u,把u加入S中(该选定的距离就是v→u的最短路径长度)。
(3) 以u为新考虑的中间点,修改U中各顶点j的最短路径长度:若从源点v→j(j∈U)的最短路径长度(经过顶点u)比原来最短路径长度(不经过顶点u)短,则修改顶点j的最短路径长度。
Dijkstra算法示例演示:
注意: dist[ ]下面的0~6的数字下面的值为源点到该数字点处的最短路径权值和。
例题:求下图的各顶点的最短路径值
拓扑排序:
真正统治世界的十大算法:
1. 归并排序,快速排序和堆排序
2. 傅立叶变换与快速傅立叶变换
3. Dijkstra 算法
4. RSA算法(一种加密算法)
5. 安全哈希算法
6. 整数因式分解
7. 链接分析(Google的Page Rank算法)
8. 比例积分微分算法
9. 数据压缩算法(以哈夫曼算法为基础)
10. 随机数生成算法
设G=(V,E)是一个具有n个顶点的有向图,V中顶点序列v1,v2,…,vn称为一个拓扑序列,当且仅当该顶点序列满足下列条件:
若<i,j>是图中的边(或从顶点i → j有一条路径):
则在拓扑序列中顶点i必须排在顶点j之前。
在一个有向图中找一个拓扑序列的过程称为拓扑排序。
2、拓扑排序步骤
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它。
(2)从图中删去该顶点,并且删去从该顶点发出的全部有向边。
(3)重复上述两步,直到剩余的图中不再存在没有前驱的顶点为止。
对与上述拓扑排序产生的结果并不唯一
因为排序的入度为0的顶点可以按照任意顺序进行书写
例如上面de拓扑排序:
①入度为0的有c1和c2所以可以先写c1或者先写c2
②假设先写c2,那么再删去c2顶点 并且删除c2顶点的所有出度的线
③此时入度为0的有c1与c7,这俩个先写谁都行
④以此类推,直到所有的数都排完序
关键路径:
1、什么是AOE网 即边表示活动的网:AOE网(Activity On Edge)
用一个带权有向图(DAG)描述工程的预计进度。
顶点表示事件,有向边表示活动,边e的权c(e)表示完成活动e所需的时间(比如天数)。
图中入度为0的顶点表示工程的开始事件(如开工仪式),出度为0的顶点表示工程结束事件。
从AOE网中源点到汇点的最长路径,具有最大长度的路径叫关键路径。
关键路径是由关键活动构成的,关键路径可能不唯一。
注意: 关键路径找的是最终这条线路的总权值之和最大的那一个(因为要完成一个工程,要当最后完成的工程完工后才算完成)
若要提高该工程的效率,减少工作天数,应该从减少关键路径权值开始,若有多个关键路径的话,只减少一个关键路径上的权值是不会提高效率的
(1)事件的最早开始时间:
事件v的最早开始时间:规定源点事件的最早开始时间为0。定义图中任一事件v的最早开始时间(early event)ee(v)等于x、y、z到v所有路径长度的最大值。
(2)事件的最迟开始时间:
事件v的最迟开始时间:定义在不影响整个工程进度的前提下,事件v必须发生的时间称为v的最迟开始时间(late event) ,记作le(v)。le(v)应等于ee(y)与v到汇点的最长路径长度之差:。
(3)对于关键活动
对于每个活动a,求出d(a)=l(a)-e(a),若d(a)为0,则称活动a为关键活动。
对关键活动来说,不存在富余时间。
举个例子:
如上图a→b→e是关键路径,所以b的最早开始时间与最晚开始时间相同都为6(没有富裕时间)
而对于该工程的另一条线路a→c→e,对于c的最早开始时间就为4,因为该工程的完成时间是7天,所以在保证不影响工程的完成时间的情况下,最晚开始时间为:7-1=6天