LONGEST-SEQUENCE(B, n, d) for i = 1 to n RANDOMIZED-QUICKSORT(B[i], 1, d) V = {B1, B2, ..., Bn} E = ∅ for i = 1 to n for j = 1 to n if IS-INSIDE(B[i], B[j]) E = E ∪ {(Bi, Bj)} G = (V, E) let T, path be new arrays for each u in V T[u] = 1 DAG-LONGEST-PATHS'(G, T) let Bj be the vertex s.t. Bj.d is maximum p = Bj while p.d != 0 INSERT(path, p) p = p.π // 进行逆序后才能得到这条路径。 REVERSE(path) return path
CURRENCY-CYCLE-PROFIT(R, n) let vertex set V = {1, 2, ..., n} let edge set E = {(1, 2), (1, 3), ..., (n, n - 2), (n, n - 1)} let weight function w(⋅, ⋅) = -lg R[⋅, ⋅] select s ∈ V randomly return not BELLMAN-FORD((V, E), w, s)
CURRENCY-NEG-CYCLE(R, n) let vertex set V = {1, 2, ..., n} let edge set E = {(1, 2), (1, 3), ..., (n, n - 2), (n, n - 1)} let weight function w(⋅, ⋅) = -lg R[⋅, ⋅] select s ∈ V randomly return GET-NEG-CYCLE(G, w, s)
DIJKSTRA-E(G, w, s) INF = |G.E| + 1 let A[0 : INF] be new array by list for each vertex u ∈ G.V - {s} u.d = INF u.π = NIL LIST-INSERT'(A[INF], u) s.d = 0 s.π = NIL LIST-INSERT'(A[0], s) S = Ø k = 0 for n = 1 to |V| while A[k] == NIL k = k + 1 u = A[k].head LIST-DELETE'(A[k], u) S = S ∪ {u} for each vertex v in G.Adj[u] if v.d > u.d + w(u, v) LIST-DELETE'(A[v.d], v) v.π = u v.d = u.d + w(u, v) LIST-INSERT'(A[v.d], v)
// 这里假设所有的函数被新构造出来后,那么所有值都已经记录好,不会随着时间推移而改变。 DIJKSTRA-W(G, s, w) W = max{w(u, v) | (u, v) ∈ G.E} k = ⌈lg (W + 1)⌉ let new function w[i](⋅, ⋅⋅) = ⌈w(⋅, ⋅⋅) / 2^i⌉ for i = 1, 2, 3, ..., k DIJKSTRA''(G, 1, w[1], s) let new function δ[1](s, ⋅) = ⋅.d for i = 2 to k let new function w'[i](⋅, ⋅⋅) = w[i](⋅, ⋅⋅) + 2 * δ[i - 1](s, ⋅) - 2 * δ[i - 1](s, ⋅⋅) DIJKSTRA-E(G, 1, w'[i], s) let new function δ[i](s, ⋅) = ⋅.d + 2 * δ[i - 1](s, ⋅) for each u ∈ G.V u.d = δ[k](s, v)
MINIMUM-MEAN-WEIGHT-CYCLE(G, s, w) let δ[0 : |G.V|, 1 : |G.V|] be new table by ∞ n = |G.V| δ[0, s] = 0 for i = 0 to n - 1 for each u ∈ G.V for each v in G.Adj[u] if δ[i + 1, v] > δ[i, u] + w(u, v) δ[i + 1, v] = δ[i, u] + w(u, v) μ∗ = ∞ for each v ∈ G.V if δ[n, v] != ∞ t = ∞ for k = 0 to |G.V| - 1 if δ[k, v] != ∞ t = max{t, (δ[n, v] - δ[k, v]) / (n - k)} μ∗ = min{μ∗, t} return μ∗
// 为了方便,假设G.E输入的是(出点,入点,边权)三元组,并且使用RELAX'子程序进行松弛操作,第三个参数接受的是边权值。 RELAX-ORDER(E, s, e) if s <= e for i = s to e RELAX'(e[i].u, e[i].v, e[i].w) else for i = s downto e RELAX'(e[i].u, e[i].v, e[i].w)
BITONIC-SHORTEST-PATHS(G, s) create a single list e of the edges in G.E sort the list of edges into monotonically increasing order by weight e[i].w // 情况1 INITIALIZE-SINGLE-SOURCE(G, s) RELAX-ORDER(E, 1, |E|) RELAX-ORDER(E, |E|, 1) for each u ∈ G.V u.d' = u.d // 情况2 INITIALIZE-SINGLE-SOURCE(G, s) RELAX-ORDER(E, |E|, 1) RELAX-ORDER(E, 1, |E|) for each u ∈ G.V u.d' = min{u.d', u.d} for i = 1 to |E| if e[i].u == s // 情况3 INITIALIZE-SINGLE-SOURCE(G, s) RELAX-ORDER(E, i, |E|) RELAX-ORDER(E, |E|, 1) RELAX-ORDER(E, 1, i) for each u ∈ G.V u.d' = min{u.d', u.d} // 情况4 INITIALIZE-SINGLE-SOURCE(G, s) RELAX-ORDER(E, i, 1) RELAX-ORDER(E, 1, |E|) RELAX-ORDER(E, |E|, i) for each u ∈ G.V u.d' = min{u.d', u.d} // 最终,u.d'代表真正的答案。