Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。java
Floyd算法可以处理带负权重的边的有向图但不能包含负权重环。算法
从起始顶点开始,依次加入一个顶点,每加入一个顶点,更新一下各条最短路径长度。各条最短路径长度保存在一个二位数组中。数组
for (int i = 0; i < V; i++) { for (int v = 0; v < V; v++) { if (edgeTo[v][i] == null) continue; // 优化 for (int w = 0; w < V; w++) { if (distTo[v][w] > distTo[v][i] + distTo[i][w]) { distTo[v][w] = distTo[v][i] + distTo[i][w]; edgeTo[v][w] = edgeTo[i][w]; } } // 检查负循环 if (distTo[v][v] < 0.0) { hasNegativeCycle = true; return; } } }
优先级限制下的并行任务调度:给定一组须要完成的任务和每一个任务所须要的时间,以及一组关于任务完成的前后次序的优先级限制。在知足条件的前提下应该如何在若干相同的处理器上安排任务并在最短的时间内完成任务?优化
“关键路径”算法能够在线性时间内解决此问题。这个问题与无环加权有向图的最长路径问题是等价的。spa
为了设计求关键路径的动态规划算法,如今定义三个术语:设计
事件i可能最先发生的时间earliest(i): 是指从开始结点s到结点i的最长路径的长度。code
事件i容许的最迟发生时间latest(i): 是值不影响效益的条件下,事件i容许发生的最晚时间。排序
关键活动: 处于关键路径上的活动是关键活动,它必须准时启动,不然就会使任务延期。事件
若latest(j) - earliest(i) = e.weight (e为顶点i和j之间的有权边),则边e是关键活动。对于关键路径上的每个关键结点i,都有latest(i) = ealiest(i).get