⍝ Spanning tree for graph ⍺ from vertex ⍵: ⎕io←1 mtree←{ ⍝ 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. } 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. } ⍝ 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]] mix←{⎕ml←0 ⋄ ↑⍵} mix{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], [5, 3]] [5, [3, 2, [4, 1]]] verts← {↑,/↓¨cmat∘⍵¨⍳⍵}∘⍴ ⍝ all combinations of a's vertices. verts a ┌─┬─┬─┬─┬─┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬───────┬───────┬───────┬───────┬───────┬─────────┐ │1│2│3│4│5│1 2│1 3│1 4│1 5│2 3│2 4│2 5│3 4│3 5│4 5│1 2 3│1 2 4│1 2 5│1 3 4│1 3 5│1 4 5│2 3 4│2 3 5│2 4 5│3 4 5│1 2 3 4│1 2 3 5│1 2 4 5│1 3 4 5│2 3 4 5│1 2 3 4 5│ └─┴─┴─┴─┴─┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴───────┴───────┴───────┴───────┴───────┴─────────┘ a∘span¨verts a ⍝ span tree for each combination ┌──────────┬──────────┬──────────┬──────────┬──────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬───────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬──────────────┐ │¯1 1 1 3 4│4 ¯1 2 3 4│4 3 ¯1 3 4│4 1 5 ¯1 4│4 3 5 3 ¯1│¯1 ¯1 2 3 4│¯1 3 ¯1 3 4│¯1 1 1 ¯1 4│¯1 1 5 3 ¯1│4 ¯1 ¯1 3 4│4 ¯1 2 ¯1 4│4 ¯1 5 3 ¯1│4 3 ¯1 ¯1 4│4 3 ¯1 3 ¯1│4 3 5 ¯1 ¯1│¯1 ¯1 ¯1 3 4│¯1 ¯1 2 ¯1 4│¯1 ¯1 5 3 ¯1│¯1 3 ¯1 ¯1 4│¯1 3 ¯1 3 ¯1│¯1 1 5 ¯1 ¯1│4 ¯1 ¯1 ¯1 4│4 ¯1 ¯1 3 ¯1│4 ¯1 5 ¯1 ¯1│4 3 ¯1 ¯1 ¯1│¯1 ¯1 ¯1 ¯1 4│¯1 ¯1 ¯1 3 ¯1│¯1 ¯1 5 ¯1 ¯1│¯1 3 ¯1 ¯1 ¯1│4 ¯1 ¯1 ¯1 ¯1│¯1 ¯1 ¯1 ¯1 ¯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) gx span 1 ¯1 1 2 3 1 5 3 7 5 9 15 8 9 13 14 15 ⍝∇ span cmat Back to: code Back to: Workspaces