ACM第四篇图论总结

图主要涉及的问题:

  最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树。

  应用举例: 在n个城市之间建造通信网络,至少要架设n-1条通信线路,而每两个城市之间架设通信线路的造价是不一样的,那么如何设计才能使得总造价最小?

  两种主要求生成树的算法

    普里姆(Prim)算法:

      基本思想:设G=(V, E)是一个无向连通网,T=(U, TE)是G的最小生成树, T的初始状态为U={u0}(u0∈V),TE={ },重复执行下述操作:在所有u∈U,v∈V-U的边中找一条代价最小的边(u, v)并入集合TE,同时v并入U,直至U=V。

    克鲁斯卡尔(Kruskal)算法:   

      基本思想:设无向连通网为G=(V, E),令G的最小生成树为T=(U, TE),其初态为U=V,TE={ },然后,按照边的权值由小到大的顺序,考察G的边集E中的各条边。

    prim一般求稠密图,kruscal算法求稀疏图。

  最短路径:最短路径是指两顶点之间经历的边上权值之和最短的路径。(最小生成树的延伸)

    Dijkstra算法:

      基本思想 设集合S 存放已找到最短路径的顶点,S的初态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk 加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。 重复上述过程,直到集合V中全部顶点加入到集合S中。

    Floyd算法:

      基本思想: 对于从vi到vj的弧,进行n次试探:首先考虑路径vi,v0,vj是否存在,如果存在,则比较vi,vj和vi,v0,vj的路径长度,取较短者为从vi到vj的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点v1,依此类推,在经过n次比较后,最后求得的必是从顶点vi到顶点vj的最短路径。

    上面的两种算法都是用于从某一点开始,到其他点的最短路径,其算法复杂度均为O(n^3)。

    关键思想通过不断的调整路径,实现最短。

    SPFA 算法:

      算法思想:我们用数组d记录每个结点的最短路径估计值,用邻接表来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止

  AOV网与拓扑排序

  AOE网与关键路径

    主要是拓扑排序

      拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1, v2, …, vn称为一个拓扑序列,当且仅当满足下列条件:若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前。 拓扑排序:对一个有向图构造拓扑序列的过程称为拓扑排序 。

假期还得练

 

posted @ 2016-07-07 10:12  SDAU_ZG  阅读(363)  评论(0)    收藏  举报