算法(使用邻接表)-Basic.ppt

算法(使用邻接表)-Basic.ppt

图的基本概念 图的基本概念 无向图的连通性 有向图的连通性 生成树 图的其它术语 图的ADT 图的存储表示 邻接矩阵 邻接矩阵 加权邻接矩阵 邻接表 邻接表 邻接表 邻接表 邻接表 邻接表的实现 邻接表的实现 十字接表 十字接表 邻接多重表 邻接多重表 图的遍历与连通性 深度优先搜索 深度优先搜索 深度优先搜索的实现 深度优先搜索的实现 广度优先搜索 广度优先搜索 广度优先搜索 无向图的连通分量和生成树 无向图的连通分量和生成树 无向图的连通分量和生成树 有向图的强连通分量的求法 有向图的强连通分量的求法 有向图的强连通分量的求法 有向图的强连通分量的求法 最小生成树 例:Kruscal 算法 例: Kruscal 算法 Kruscal 算法 最小生成树 Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 例:Prim算法 Prim算法 Prim算法 Prim算法 Prim算法 最短路径 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Floyd算法 Floyd算法 Floyd算法 活动网络 拓扑排序 拓扑排序 拓扑排序 拓扑排序 拓扑排序 拓扑排序 拓扑排序 AOE网络 关键路径 关键路径 关键路径 关键路径 关键路径 关键路径 关键路径 关键路径 Dijkstra 算法: 6、7的解释: V0 源点 X V 老 S V-S W 新 S Dijkstra 算法求单源最短路径: 设 V 是该有向图的结点的集合、集合 S 是已求得最短路径的结点的集合, 求 V0 至其余各结点的最短距离。S[i]=1,表示结点i在S中,否则不在。 1、S[0] = 1 ;// 结点 V0 最短路径已求得,是源点。 2、for ( i=1; in; i++ ) 3、 { D[i]=c[ 0, i ]; S[i]=0; Path[ v ] = -1; } 4、for ( i=1; in; i++ ) 5、{ 在 V-S 中选择一个结点VW;使得 D[w] 最小。将W 加入集合 S // 用最小化堆选 6、 for (每一个在 V-S 中的结点 v) //出最小的 6.5 { if (D[w]+C[w,v] D[v ]) Path[ v ] = w; 7、 D[v]=MIN( D[v],D[w]+C[w,v]) 8 }; //如用最小化堆实现,此处还要调整堆 9、 } 注意:本书的实现程序见程序7.6。其中,AdjMatrix[j*MaxNumVertex+k ] 保存顶点j、k之间的路径长度,替代邻接矩阵,即:Adj[j,k]。 3 2 0 4 100 10 1 60 30 10 20 50 源点 Dijkstra 算法: 正确性证明 设 V 是结点的集合,S 是已经得到最短 路径(由源点至本结点)的结点的集合。 T = V - S V0 源点 Vz Vy Vx Vl Vm Vn Vn 证明:设 V0 经 S 中的j结点,到 VZ 后直接 经有向边到达结点 Vj 的路径,是所有 这些路径中最短的。如图所示,路径 p1p2; p1p3;p1p4。则 p1 就是源 点 V0 至 Vj 的最短路径。 假定存在一条更短的路径,那么肯定 要经过 T - { Vj } 中的一个顶点,设 为 V3 ;但 p3 p1,同假设矛盾,不 可能。 Dijkstra 算法: 边的权值不可以为负值。 V0 V1 V2 100 -99 5 S T V p1 p2 p3 p4 注意:边的权值不可以为负值,这一点可以 从上述证明中推出。 声明:Dijkstra 算法和Prim算法本质是相同的,甚至可以用同一个函数求出,区别仅在于权值不同。 Dijktra算法邻接表示图且使用最小化堆时的时间复杂性O((n+e)logn)和 Prim 算法情况类似。 10 30 20 70 5 36 24 75 85 60 94 1.建最小化堆代价:O(n) 2.最小化堆中的所有结点,都将会输出。输出一个,堆都会

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档