Inputs: origin, origin line , , , |
for each node n in Graph: |
-n.dist ≔ infinity; |
-n.trCnt ≔ 0; // Transfer Count |
-n.previous ≔ undefined; |
|
origin.dist ≔ 0; |
Q ≔ Priority queue according to distance; |
enqueue origin into Q; |
|
while Q.isEmpty != true: |
-u ≔ node with min distance in Q; |
-remove u from Q; |
|
-for each outbound edge e of node u: |
--v ≔ node reachable from u with edge e; |
--e.weight ≔ infinity; |
--if e.Line : |
---if u.previous != null: prev_e ≔ edge used for reaching to u; |
----if e is a line: |
-----if ((u.trCnt = 2 and e.Line = prev_e.Line) or |
(u.trCnt = 1 and e.Line != prev_e.Line and e.Line ∈ ) or |
(u.trCnt = 1 and e.Line = prev_e.Line) or |
(u.trCnt = 0 and e.Line != prev_e.Line and e.Line ∈ ) or |
(u.trCnt = 0 and e.Line = prev_e.Line)): e.weigth ≔ ; |
----else // e is a foot-edge |
-----if ((u.trCnt = 0 and prev_e is a line) or |
----- (u.trCnt = 1 and prev_e is a line)): e.weigth ≔ ; |
-----else e.weigth ≔ infinity; |
---else // u.previous = null: |
----if e.Line is : e.weigth ≔ ; |
|
-for each outbound edge e of node u: |
--v ≔ node reachable from u with edge e; |
--prev_e ≔ edge used for reaching to u; |
--dist_v ≔ u.dist + e.weigth; |
--if dist_v < v.dist: |
---dequeue v from Q with key v.dist; |
---v.dist ≔ dist_v; |
---v.previous ≔ u; |
---v.trCnt ≔ u.trCnt; |
---if e.Line != prev_e.Line: v.trCnt ≔ u.trCnt + 1; |
---enqueue v into Q with key dist_v; |
|
S ≔ empty sequence; |
u ≔ target; |
while u.previous is not null: |
-insert u into S; |
-u ≔ u.previous; |