013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记

多源最短路:有向图,求从每个顶点到其他所有顶点的最短距离。

基本思路:

假设有向图的所有点编号为1到n,l[i,j]表示从i到j的边的长度,如果不存在边,则置为正无穷。

定义d(k,i,j)表示从点i到点j,并且不经过编号大于k的点的最短距离。

初始化条件:

K=0时,d(0,i,j)=l[i,j]。

状态转移方程:

d(k,i,j)=min{ d(k-1,i,j),d(k-1,i,k)+d(k-1,k,j) }   1<=k<=n

于是我们有如下的递归式:

算法分析:

显然,Floyd算法的时间复杂度是Θ(n3),空间复杂度是Θ(n2)。

伪代码:

C++代码:

for( int k = 1; k <= n; ++k )
  for( int i = 1; i <= n; ++i )
    for( int j = 1; j <= n; ++j )
      d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
时间: 2024-10-19 14:19:14

013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记的相关文章

数据结构与算法 -- 动态规划算法

1.0-1背包问题 //0-1背包问题--动态规划算法 public class DynamicPlan { public static void main(String[] args) { DynamicPlan dynamicplan = new DynamicPlan(); int[] weight = {1, 2, 3, 4, 5}; System.out.println("方法一 背包所装物品的重量为:" + dynamicplan.knapsack(weight, weig

014-背包问题-动态规划-《算法设计技巧与分析》M.H.A学习笔记

01背包: 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2--Wn,与之相对应的价值为P1,P2--Pn.求能获得的最大总价值. 基本思路: V[i,j]表示从前i件物品中取出的,能装入体积为j的背包的物品的最大总价值. 初始化条件: V[i,0]和V[0,j]都为0,我们从其意义上就可以理解. 状态转移方程: V[i,j]=max{ V[i-1,j],V[i-1,j-Wi]+Pi } ,前后分别为第i件物品不取和取得情况. 总的就是下面的递推式: 算法分析: 表

016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记

最小生成树: 在一给定的连通无向图G = (V, E)中,(u, v) 代表连接顶点u与顶点v的边,而 w(u, v)代表此边的权重,若存在T为G的子集且为无循环图,使得w(T) 最小,则此T为G的最小生成树. 基本思路: kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中.注意到所选取的边若产生环路则不可能形成一棵生成树.kruskal算法分e 步,其中e 是网络中边的数目.按耗费递增的顺序来考虑这e 条边,每次

017-Prim算法-贪心-《算法设计技巧与分析》M.H.A学习笔记

基本思路: 定义结点集合U, V (U表示已经选择加入MST的结点集合,V表示未选) 1. 任选一个结点加入U 2. 选择一条边权最小的边,他的两个结点分别属于U, V,并把属于V的那个结点加入U 3. 重复执行2直到V空 伪代码: C++代码: int g[mnx][mnx]; int n, m; int d[mnx]; // 朴素 prim, 复杂度O(|V|^2) |V|:点数, |E|:边数 int prim() { memset(d, 0x3f, sizeof d); //初始化 in

算法设计技巧与分析笔记 第一章

1.搜索:设A[1--n]为一个n个元素的数组,判定给定元素x是否在A中 线性搜索:直接扫描A中所有项目,将每个项目与x做比较. 二分搜索: A[low--high]为有序非空数组(假定为升序),A[mid]为中间元素 假定x>A[mid],则丢弃A[low-mid],继续搜索A[mid+1-high]: 假定x<A[mid],则丢弃A[mid-high],继续搜索A[low-mid-1]: 若x=A[mid],返回mid,结束搜索. 算法分析:时间复杂度:O(log n) 2.排序:设A[1

019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记

深度优先搜索DFS 深搜框架: bool dfs(int loc) { 标记状态loc已访问; if (loc为目标状态) return true; for (每个可能的操作) { 对loc应用操作产生新状态nstat; if (nstat合法且未被访问) { if (dfs(nstat)) return true; } } 撤销loc已访问标记; // 这步要具体问题具体分析了 return false; } 广度优先搜索BFS 实现方法 1. 首先将根节点放入队列中. 2. 从队列中取出第一

018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记

Huffman树是完全二叉树,权重较大的节点距离根较近. Huffman编码是一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字. 基本思路: 建立Huffman树的过程: 假设有n个权值,则构造出的哈夫曼树有n个叶子结点. n个权值分别设为 w1.w2.-.wn,则哈夫曼树的构造规则为: (1) 将w1.w2.-,wn看成是有n 棵树的森林(每棵树仅有一个结点): (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左.右子树,且新树的根结点权值为其左.右子树

《Linux内核设计与实现》第四章学习笔记

第四章 进程调度 [学习时间:1小时45分 撰写博客时间:2小时10分钟] [学习内容:Linux的进程调度实现.抢占和上下文切换.与调度相关的系统调用] 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统. 最大限度利用处理器时间的原则:只要有可以执行的进程,那么总会有程序正在执行. 一.多任务 1.概念:多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这会产生多个进程在同时运行的幻觉

操作系统精髓与设计原理(原书第6版)——学习笔记(9)

 2.5.4 客户/服务器模型 Windows操作系统服务.受保护子系统和应用程序都采用客户/服务器计算模型构造,客户/服务器模型是分布式计算中的一种常用模型. 客户/服务器结构的优点如下: 简化了执行体.可以在用户态服务器中构造各种各样的API,而不会有任何冲突或重复:可以很容易地加入新的API. 提高了可靠性.每个新的服务运行在内核之外,有自己的存储空间,这样可以免受其他服务的干扰,单个客户的失败不会使操作系统的其余部分崩溃. 为应用程序与服务间通过RPC调用进行通信提供了一致的方法,且