bool connected(graph g) return g.vertices().size() = visit(g, g.vertices().pick()) int visit(graph g, vertex v) if not v.visited cnt = 1 v.visited = true for n in g.neighbors(v) cnt += visited(g, n) return cnt
|
|
|
bool biconnected(graph g) root = g.vertices().pick() root.depth = 0 return root.neighbors().size() < 2 and is_biconnected(g, root) bool is_biconnected(graph g, vertex v) min-depth = v.depth for n in g.neighbors(v) if n.depth > -1 min-depth = min(min-depth, n.depth) else n.depth = v.depth + 1 if not is_biconnected(g, n) return false return min-depth < v.depth
|
graph spanning_tree(graph g) queue unvisited(g.vertices().pick()) t.add_vertex(unvisited.head()) while not unvisited.empty() v = unvisited.deq() for n in g.neighbors(v) if not t.vertices().member(n) t.add_vertex(n) t.add_edge(v, n) unvisited.enq(n) return t
|
|
graph mst(graph g) min-queue minq vertex v = g.vertices().pick() for n in g.neighbors(v) minq.enq((v, n), g.weight(v, n)) while not minq.empty() e = minq.deq() v = e.second() if not mst.vertices().member(v) mst.add_edge(e) for n in g.neighbors(v) if not mst.vertices().member(n) minq.enq((v, n), g.weight(v, n)) return mst
mst()
has O((V + E)log V) running time.
dist
.
dist[
vi]
is the weight of the minimum path from
vs to vi.
min-path(graph g, vertex v1) unsigned dist[g.vertices().size()] = { ∞ } min-queue minq for n in g.neighbors(v1) dist[n] = g.weight(v1, n) minq.enq((v1, n), g.weight(v1, n)) while not minq.empty() e = minq.deq() v = e.second if dist[v] > dist[e.first] + g.weight(e) dist[v] = dist[e.first] + g.weight(e) for n in g.neighbors(v) if not n mst.vertices().member(n) minq.enq((v,n),dist[v]+g.weight(v,n))
min-path()
has O((V + E)log V) running time.
parent
.
parent[
ve]
and then take (parent[
ve]
,
ve).
|
|
list pert-sched(graph g, vertex v) return sched(g, v, list.create()).reverse() list sched(graph g, vertex v, list l) if not v.visited v.visited = true for n in g.neighbors(v) sched(g, n) return l.add(v)
|
|
list schedule(graph g) list sch while g.vertices().size() > 0 list tier for n in g.vertices() if g.in_degree(n) = 0 tier.add(n) g.remove(n) sch.add(tier) return sch
|
|