⍝ Quickest path from/to ⍵ in weighted graph ⍺:
Alpha ##.test'wGraphs'
⍝ Mike's cases:
⍝ A───2──→B
⍝ │ │
⍝ 3 1
⍝ ↓ ↓
⍝ C───2──→D
md1←,¨↑ ((2 3)4 4 ⍬) ((2 3)1 2 ⍬)
⍝ A B C D / A B C D
1 disp md1
┌→──┬─┬─┬─┐
↓2 3│4│4│0│
├~─→┼→┼→┼⊖┤
│2 3│1│2│0│
└~─→┴→┴→┴⊖┘
md1 wpath 1 4 ⍝ path from A to D.
1 2 4
⍝ ┌───2───B───2───┐
⍝ │ │
⍝ ↑ ↓
⍝ │ │
⍝ A───2──→C───1──→E
⍝ │ │
⍝ ↓ ↑
⍝ │ │
⍝ └───2───D───2───┘
md2←,¨↑((2 3 4) 5 5 5 ⍬) ((2 2 2)2 1 2 ⍬)
⍝ A B C D E / A B C D E
md2 wpath 1 5 ⍝ path from A to E.
1 3 5
mattographa←{
i←{⍵⍴⍳×/⍵}⍴⍵
max←1+⌈/,i
⍺←1 1 1 1 ⍝ if up left right down
addlink←{
1 1↓¯1 ¯1↓⍺{
⍺=0:⍵
⍺=1:¯1⊖⍵
⍺=2:¯1⌽⍵
⍺=3:1⌽⍵
⍺=4:1⊖⍵
}⍵
}
op←⍺/⍳4
w←max,max,⍨max⍪max⍪⍨i
links←,{⍵/⍨⍵<max}¨↓[⎕IO]↑op addlink¨⊂w
costs←links{⍺⊃¨⊂⍵}¨⊂,⍵
links←(⊂⊂¨,i)⍳¨⊂¨¨links
↑links costs
}
small←0 5⍴0
small ⍪← 131 673 234 103 18
small ⍪← 201 96 342 965 150
small ⍪← 630 803 746 422 111
small ⍪← 537 699 497 121 956
small ⍪← 805 732 524 37 331
1 25 wpath⍨ 0 0 1 1 mattographa small
1 6 7 8 13 14 19 24 25
m2g←{ ⍝ Graph from weightings matrix.
⍺←1 1 1 1 ⍝ up left right down.
dirns←⍺/(¯1 0)(0 ¯1)(0 1)(1 0) ⍝ directions.
xvecs←dirns∘+∘⊂¨⍳⍴⍵ ⍝ index vectors per link.
links←,{⍵⍳¨⍵∩¨xvecs}⊂,⍳⍴⍵ ⍝ unweighted graph.
costs←,links{⍺⊃¨⊂⍵}¨⊂,⍵ ⍝ costs per link.
↑links costs ⍝ weighted graph.
}
1 25 wpath⍨ 0 0 1 1 m2g small
1 6 7 8 13 14 19 24 25
Back to: code
Back to: Workspaces