=====================
最小生成树:
prime:
一个集合U表示已加入最小生成树的点,集合E表示最小生成树的边:
一开始,任选一个顶点加入集合U中,找到集合U中的顶点里权值最小的边,加入至E。将边中另一个顶点加入集合U中,重复上述过程,直到所有顶点加入至集合U中
kruskal:
集合U表示加入最小生成树的点,集合E表示最小生成树的边
将所有边的权值从小到大排序,最小的边并且两个顶点属于不同的连通分量时,加入至E,顶点加入至U,直到所有的顶点加入至集合U中。
=====================
DAG:无环有向图
实现对相同子式的共享,从而节省存储空间
=====================
AOV 顶点表示活动,弧表示活动之间的优先关系
注:AOV网中不能出现回路
=====================
拓扑排序:
从AOV网中选择一个没有前趋的顶点并且输出它
从AOV网中删除该顶点,并且删除以该顶点为弧尾的弧
结果:全部顶点被输出
否则:AOV网中存在回路
=====================
AOE 顶点代表事件,有向边表示活动,边上的权值代表活动持续的时间
源点:入度为0 汇点:出度为0
性质:
只有该顶点代表的事件结束后,以该顶点出发的活动才能开始
只有在进入某顶点的各活动结束后,该顶点所代表的时间才能发生
关键路径:由关键活动组成的从源点到汇点的路径
关键活动:活动的最早发生时间=活动的最早结束时间
1)事件最早发生时间ve[k]
只有进入v[k]的所有活动<vj,vk>,v[k]代表的事件才能发生。而活动<vj,vk>最早结束时间=ve[j]+value<vj,vk>.
所以:ve[k]=max(ve[j]+value<vj,vk>),前提是<vj,vk>存在,1<=k<=n-1
2)事件最迟发生时间vl[k]
<vk,vj>代表从vk出发的活动,为了不拖延整个工期,vk发生的最迟时间必须保证不推迟从vk出发的所有活动。
所以vl[k]=min(vl[j]-<vk,vj>),前提是<vk,vj>存在,1<=k<=n-1(逆拓扑排序)
3) 活动ai最早发生时间ee[i]
活动ai由<vj,vk>表示,只有事件vj发生了,活动ai才能开始。活动ai最早发生时间等于事件vj最早发生时间。
所以ee[i]=ve[j].
4) 活动ai最迟发生时间el[i]
活动ai由<vj,vk>表示,只要保证事件vk最迟发生时间不拖后。
所以el[i]=vl[j]-value<vk,vj>.
=====================
最短路:
Dijkstra:
单源点求最短路径:
将v0作为源点,集合S是已经确定最短路的顶点,将与v0相关联最小权值的边的顶点加入集合S中,更新S中的点与剩余的点的最短路径,再找与集合S中相关联的权值最小的边,将另一个的顶点加入至S中,更新S中的点与剩余的点的最短路径,重复上述过程,直至所有顶点加入至S中
每一对顶点之间的最短路径:
每次以一个顶点为源点重复执行Dijkstra算法n次求得
floyd:
if(d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j];