tree ← graph ##.span fm     ⍝ Breadth-first span tree for graph ⍺ from vertex ⍵.

Returns a tree that, starting from the given vertex, spans all accessible verti-
ces  of  the  graph  "breadth-first".  The tree has the property that it has the
least  depth  possible: no spanning tree exists that has a shorter path from its
root to any vertex.

More  generally,  [fm] may be a _vector_ of vertices, in which case the breadth-
first search starts in parallel from each given vertex.

The  tree is returned in compact form: each item of the vector, with the except-
ion of the root item, is the index of the tree node's parent node.

The  following  operator  may be used to display the tree in an indented format.
The function operand takes a vertex number and returns a label:

      mtree←{⎕ML←0                  ⍝ Matrix format of spanning tree.
          vfmt←⍺⍺                   ⍝ vertex format function.
          tree←⍵                    ⍝ spanning tree.
          ↑''{                      ⍝ mix to char matrix.
              this←⊂⍺,⊃vfmt ⍵       ⍝ indented, formatted vertex.
              next←(tree=⍵)/⍳⍴tree  ⍝ child vertices of current vertex ⍵.
              next≡⍬:this           ⍝ childless: finished.
              dent←⍺,'·   '         ⍝ increased indent.
              this,↑,/dent∘∇¨next   ⍝ formatted sub-trees.
          }tree⍳¯1                  ⍝ ... from starting vertex.
      }

... and this function displays the tree in list format:

      ltree←{                       ⍝ List format of spanning tree.
          tree←⍵                    ⍝ spanning tree.
          bkt←{'[',⍵,']'}           ⍝ bracket.
          sep←{↑{⍺,', ',⍵}/⍵}       ⍝ comma-separate.
          {                         ⍝ radiate outwards from root:
              next←(tree=⍵)/⍳⍴tree  ⍝ nodes that point to this one.
              next≡⍬:⍕⍵             ⍝ none: finished.
              bkt sep(⊂⍕⍵),∇¨next   ⍝ node followed by sub-trees.
          }⍵⍳¯1                     ⍝ starting from root.
      }

Technical notes:

This coding differs slightly from classic breadth-first search, see →bfs←.

Examples:

⍝      Graph "a".
⍝    ┌─────1←────┐   5 vertices: 1 2 3 4 5
⍝    │     │     │
⍝    ↓     ↓     │   8 edges:    1→2  1→3
⍝    2←───→3────→4               2→3
⍝          ↑     │               3→2  3→4
⍝          │     ↓               4→1  4→5
⍝          └─────5               5→3

      a←(2 3)(3)(2 4)(1 5)(3)       ⍝ simple origin-1 graph.

      show←{↑⍕¨(⍳⍴⍵),¨'→',¨⍵}       ⍝ show graph.

      show a                        ⍝ graph "a".
1 → 2 3
2 → 3
3 → 2 4
4 → 1 5
5 → 3

      a span 1                      ⍝ spanning tree from vertex 1.
¯1 1 1 3 4

      a span 3                      ⍝ spanning tree from vertex 3.
4 3 ¯1 3 4

      ⍕mtree a span 3               ⍝ formatted spanning tree from vertex 3.
3
·   2
·   4
·   ·   1
·   ·   5

      ltree a span 3                ⍝ list-format spanning tree from vertex 3.
[3, 2, [4, 1, 5]]

      ↑{ltree a span ⍵}¨⍳⍴a         ⍝ list format for all of a's span trees.
[1, 2, [3, [4, 5]]]
[2, [3, [4, 1, 5]]]
[3, 2, [4, 1, 5]]
[4, [1, 2, 3], 5]
[5, [3, 2, [4, 1]]]

    gx←(2 5)(1 3 6)(2 4 7)(3 8)(1 6 9)(2 5)(3 8)(4 7 12)(5 10 13)(9 14)(12 15)(8 11 16)(9 14)(10 13 15)(11 14 16)(12 15)

    ⍝   graph gx:                       breadth-first visiting sequence:
    ⍝
    ⍝   1───────2───────3───────4      [1]─────[2]─────[3]─────[4] c.f. →dfspan←
    ⍝   │       │       │       │       │               │
    ⍝   │       │       │       │       │               │
    ⍝   │       │       │       │       │               │
    ⍝   5───────6       7───────8      [2]─────[3]     [4]─────[5]
    ⍝   │                       │       │                       │
    ⍝   │                       │       │                       │
    ⍝   │                       │       │                       │
    ⍝   9──────10      11──────12      [3]─────[4]     [7]     [6]
    ⍝   │       │       │       │       │               │
    ⍝   │       │       │       │       │               │
    ⍝   │       │       │       │       │               │
    ⍝  13──────14──────15──────16      [4]─────[5]─────[6]─────[7]

      gx span 1
¯1 1 2 3 1 5 3 7 5 9 15 8 9 13 14 15

See also: Graphs bfs stpath path search dfspan

Back to: contents

Back to: Workspaces